当前位置:首页 > 问答 > 正文

安卓数据库那些事儿,教你怎么在手机里玩转数据存储和操作

行,那咱们就直接开聊安卓数据库那些事儿,说白了,就是在你手机App里,怎么把那些零零碎碎的数据,比如用户的昵称、设置、聊天记录、游戏进度啥的,给好好地存起来,并且能随时找到、改掉或者删掉。

为啥非得用数据库?文件存一下不行吗?

你可能会想,我直接把数据写到一个txt文件里存手机里不就行了?对于非常非常简单的数据,比如就存一个“是否第一次打开App”的标记,这确实可以,但数据一多、一复杂,比如你要存100个联系人的姓名、电话、邮箱、头像路径,这时候用文件存就特别麻烦。

想象一下,你想找“张三”的电话,你得把整个文件读出来,一行一行地找;你想删掉“李四”的记录,操作起来更棘手,这就像你有一个大杂货箱,东西全扔进去,找起来会疯掉,而数据库呢,就像一个带很多抽屉和标签的智能柜子,你告诉它“我要找张三的电话”,它唰一下就给你了,特别高效,当数据有结构、有关联、需要频繁查询和更新时,数据库就是最佳选择。

安卓里的“原配”小能手:SQLite

安卓系统内置了一个轻量级的数据库引擎,叫SQLite(根据安卓开发者文档,系统内置SQLite数据库),它不用单独安装,App可以直接用,它把整个数据库就是一个文件,放在App的私有空间里,其他App访问不了,安全。

那怎么操作这个SQLite呢?主要靠两个帮手:

安卓数据库那些事儿,教你怎么在手机里玩转数据存储和操作

  1. SQLiteOpenHelper(帮建房子的): 这个类是你的大管家,你告诉它数据库的名字和版本号,它就来帮你创建数据库文件(如果还没有的话),或者帮你把旧版本的数据库升级到新版本,你在它里面写一些“建表语句”,比如创建一个表叫User,里面有idnameage三个字段,它就会帮你把柜子的抽屉(表)和格子(字段)都打好。
  2. SQLiteDatabase(干具体活的): 房子建好了,就要往里放东西、取东西,这个类就提供了各种方法让你进行“增删改查”:
    • 增(Insert): 把一条新的联系人记录塞进数据库。
    • 删(Delete): 根据条件,比如id=5,干掉那条记录。
    • 改(Update): 把id=5的那个人的名字从“王五”改成“王伍”。
    • 查(Query): 这个最常用,可以很简单地查“所有联系人”,也可以复杂地查“年龄大于20岁且姓张的联系人,按姓名排序”。

虽然SQLite很强大,但直接用它有点啰嗦,你要写很多原始的SQL命令字符串,容易出错,后来谷歌给了个更简单的工具。

懒人福音:Room持久化库

因为直接用SQLite有点麻烦,谷歌就推出了一个叫Room的库(根据Android开发者指南,Room是在SQLite之上提供了一个抽象层),你可以把它理解为SQLite的“贴心秘书”。

Room帮你把那些繁琐的步骤都封装好了,你用起来就更省事:

安卓数据库那些事儿,教你怎么在手机里玩转数据存储和操作

  1. @Entity(定义数据模型): 你不用再写复杂的建表SQL语句了,你就定义一个普通的Java类(比如User类),在类名上面加个@Entity注解,它就知道:“哦,你要一张User表”,类里面的每个字段,比如name, age,就自动对应表里的每一列,这特别符合我们写代码的思维。
  2. @Dao(定义操作接口): 你要进行的“增删改查”操作,不用再写一堆方法了,你定义一个接口(比如UserDao),然后在里面的方法上加上注解,比如@Insert, @Delete, @Query,你甚至可以在@Query后面写上简单的SQL语句,比如"SELECT * FROM user WHERE age > :minAge",Room会帮你生成所有具体的实现代码,这避免了手写SQL容易出错的问题。
  3. @Database(定义数据库本身): 你用一个注解来告诉Room,你的数据库是哪个版本,里面包含了哪些表(也就是哪些@Entity类)。

用了Room之后,你的代码会变得非常整洁和安全,因为很多错误(比如SQL语句写错了、字段名拼错了)在编译代码的时候就会被发现,而不是等到App运行起来才崩溃。

除了数据库,还有别的存数据的法子吗?

当然有!数据库不是万能的,杀鸡焉用牛刀。

  • SharedPreferences(偏好设置): 这个最适合存一些简单的配置信息(根据Android平台API文档,SharedPreferences用于存储简单的键值对数据),比如App的主题是亮色还是暗色、音效是否开启、登录的用户名(不是密码!密码得用更安全的方式),它存的数据就像是一个个的“键值对”(key-value),"theme"对应"dark""sound_on"对应true,这东西用起来超级简单,几行代码就搞定。
  • 文件存储: 像图片、音频、视频、下载的文档这些“大块头”二进制数据,或者一段纯文本日志,直接存成文件更合适,数据库则更适合存结构化的、需要索引和查询的信息。

实战里的小窍门

  1. 别在主线程操作数据库: 数据库操作(尤其是复杂的查询)可能会慢一点,如果在主线程(也叫UI线程)干这个,手机界面就会卡住,用户会感觉App“未响应”,所以一定要在后台线程去做。
  2. 数据库升级要小心: 如果你的App更新了,数据库结构也要变(比如新增一个字段),你必须在SQLiteOpenHelperonUpgrade方法里写好升级逻辑,帮老用户把旧表结构迁移到新结构,否则一升级App,老用户的数据可能就丢了或者打不开了。

在安卓里玩转数据:

  • 零碎设置 -> 用SharedPreferences
  • 大量结构化数据,要频繁查找管理 -> 用数据库,强烈推荐Room库,它让操作SQLite变得简单又安全。
  • 图片、大文件 -> 直接用文件存储。

希望这些大白话能帮你在手机里轻松玩转数据存储!