Room - SMAXLYB/JetpackPractice GitHub Wiki

Room

Android采用Sqlite作为数据库存储,但Sqlite代码繁琐容易出错,就出现了ORM库,ROOM则是Google自家的ORM库,在Sqlite上做了一层封装。

  • 主要元素:
  1. Entity:一个entity代表数据库中的一张表
  2. Dao:数据访问对象,通过dao访问数据库的数据,增删改查,每张表都需要对应一个dao。
  3. 数据库:通过数据库实例获取dao
  • 如何使用:
  1. 添加依赖,新建一个实体类,用@Entity注解,表示数据表,可以定义表名,在类中添加属性,用@ColumnInfo注解,可以定义列名、类型等。
  2. 新建Dao类,用@Dao注解,新建方法,用@insert/delete/update/query注解,其中query注解需要定义SQL语句。
  3. 新建database抽象类,继承自RoomDatabase类,用@Database注解,需要定义反射的实体类以及数据库当前版本,在类中定义抽象方法,返回Dao类对象。新建方法,返回单例数据库:room.databaseBuilder(context,数据库class,数据库名称).build()
  4. 要进行数据操作时,直接用单例数据库调用抽象方法获取Dao对象,在Dao对象上调用insert/delete/update/query方法,对数据进行操作。注意不要在UI线程操作。
  5. 结合ViewModel和LiveData:在自定义Dao类中,方法中返回的数据用LiveData包装,Room数据发生改变时会自动通知LiveData。自定义ViewModel类,继承自AndroidVIewModel类,可以获取到数据库单例,然后对外提供获取LiveData数据的方法,在页面中进行LiveData的监听,当Room数据库发生改变时,LiveData收到通知,继而改变UI
  6. 升级数据库:在自定义database抽象类中,新增Migration子类对象,其中只有一个migration方法,在此方法中 对数据库做迁移操作,例如新建表,转移数据,删除旧表等,将此Migration子类对象传入创建数据库单例时的构造方法链中调用addMigrations(),为了防止升级失败,还要调用fallbackToDestructiveMigaraion(),最后build(),别忘了修改数据库版本
  7. Schema:每次查看数据库是否符合预期操作,需要借助第三方工具查看SQLite,很不方便,Room提供了Schema,在数据可升级时会自动生成,包含数据库的基本信息,可以在build.gradle中自定义导出位置
  8. 预填充数据库:如果自身已有db文件,需要事先创建数据库并导入这个db文件数据,可以将db文件放在asset目录下,在创建数据库单例时的构造方法链中调用createFromAsset(路径),或者将db放在自定义路径,调用createFromFile(路径),最后build()