美文网首页
Room使用篇三

Room使用篇三

作者: Method | 来源:发表于2021-01-17 18:19 被阅读0次

创建数据库

将实体和 DAO整合在一起的类是 RoomDatabase,先创建一个扩展 RoomDatabase 的抽象类,对它进行注释,声明实体和相应的 DAO。

数据库的创建是一件非常消耗资源的工作,所以我们将数据库设计为单例,避免创建多个数据库对象。另外对数据库的操作都不能放在 UI 线程中完成,否则会出现异常:

Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

给出我们设计的数据库:

@Database(entities = [PlayerModel::class, TeamModel::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class NBADatabase : RoomDatabase() {

    abstract fun playerDao(): PlayerDao
    abstract fun teamDao(): TeamDao

    companion object {
        @Volatile
        private var INSTANCE: NBADatabase? = null

        fun getInstance(context: Context): NBADatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    context.applicationContext,
                    NBADatabase::class.java,
                    "nba_db"
                ).addCallback(object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                    }

                    override fun onOpen(db: SupportSQLiteDatabase) {
                        super.onOpen(db)
                    }
                }).build().also {
                    INSTANCE = it
                }
            }
        }
    }
}

在创建数据库时需要完成以下几件工作:

  • 设计成单例模式,避免创建多个数据库对象消耗资源;
  • 创建的数据库类需要继承 RoomDatabase,数据库类声明为抽象类;
  • 需要提供方法来获取数据访问对象层(Dao)对象,方法声明为抽象方法;
  • 数据库类需要使用@Database注解,@Database包括几个参数:entities(数据库包含的数据表,@entities注解修饰的实体),default(数据库包含的视图),version(数据库的版本号),exportSchema(可以理解为开关,如果开关为 true,Room 框架会通过注解处理器将一些数据库相关的schema输出到指定的目录中,默认 true)

其他常见注解

序号 注解名称 描述
1 @ColumnInfo.SQLiteTypeAffinity 可以在typeAffinity()中使用的SQLite列类型常量,包括:UNDEFINED, TEXT, INTEGER, REAL, BLOB,其中 UNDEFINED 未定义类型关联,将根据类型解析;TEXT SQLite列类型为 String;INTEGER SQLite列类型为 Integer 或 Boolean; REAL SQLite列类型为 Float 或 Double;BLOB SQLite列类型为二进制类型
2 @Dao 将类标记为数据访问对象(Data Access Object)
3 @Database 将类标记为RoomDatabase
4 @Delete 将 DAO 中的方法标记为与删除相关的方法
5 @Embedded 可以用作实体或Pojo字段上的注释,以指示嵌套字段
6 @ForeignKey 在另一个实体上声明外键
7 @ForeignKey.Action 可以在onDelete()和onUpdate()中使用的值的常量定义。包括:NO_ACTION, RESTRICT, SET_NULL, SET_DEFAULT, CASCADE
8 @Ignore 忽略Room的处理逻辑中标记的元素
9 @Index 声明实体的索引
10 @Insert 将Dao注释类中的方法标记为插入方法
11 @OnConflictStrategy Dao方法处理冲突的策略集合,包括:REPLACE, ROLLBACK, ABORT,FAIL,IGNORE,其中ROLLBACK和FAIL已经被标记为@Deprecated,REPLACE用新的数据行替换旧的数据行;ABORT直接回滚冲突的事务;IGNORE保持现有数据行。
12 @PrimaryKey 将实体中的字段标记为主键
13 @Query 将Dao注释类中的方法标记为查询方法
14 @RawQuery 将Dao注释类中的方法标记为原始查询方法,可以将查询作为SupportSQLiteQuery传递
15 @Relation 一个方便的注释,可以在Pojo中用于自动获取关系实体。
16 @SkipQueryVerification 跳过带注释元素的数据库验证
17 @Transaction 将Dao类中的方法标记为事务方法
18 @TypeConverter 将方法标记为类型转换器
19 @TypeConverters 指定Room可以使用的其他类型转换器
20 @Update 将Dao注释类中的方法标记为更新方法

相关文章

  • Room使用篇三

    创建数据库 将实体和 DAO整合在一起的类是 RoomDatabase,先创建一个扩展 RoomDatabase ...

  • Room使用篇

    WHAT 什么是数据存储? 缓存相关数据。当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备重新连接到网...

  • Room使用篇二

    DAO 是什么 Dao 对象构成了 Room 的主要组件,因为每个 DAO 都包含一些方法比如数据的增删改查,这些...

  • Android 中使用 Room 实践

    使用Room进行持久化存储---综述通过 Room entities 定义数据 ---Room 系列(1)使用 R...

  • Android MVVM设计模式(Room)

    正文 今天我们来集成使用jetpack的room Room: The Room persistence libra...

  • Android Jetpack架构组件-Room升级

    了解Room框架的使用 Android Jetpack架构组件-Room基本使用Android Jetpack架构...

  • Room学习整理

    目录 [TOC] 这不是一篇很好的入门文章,仅做记录使用,更好的还是直接参考文末的官方向导 Room Room 是...

  • Room demo tutorial - Kurento Roo

    Room demo tutorial 本教程是使用Room API SDK开发多协作应用程序的指南,共有三个基本结...

  • Google Architecyure Components 中

    Room 是Google新推出的数据库框架,使用注解的方式简化的数据库的操作使用。 Room中有三个主要的组成部分...

  • [译] 使用 Room 的 DAO 访问数据---Room 系列

    本文翻译自官网使用Room进行持久化存储---综述通过 Room entities 定义数据 ---Room 系列...

网友评论

      本文标题:Room使用篇三

      本文链接:https://www.haomeiwen.com/subject/oiqzaktx.html