Room使用篇三

2021-01-17  本文已影响0人  Method

创建数据库

将实体和 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
                }
            }
        }
    }
}

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

其他常见注解

序号 注解名称 描述
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注释类中的方法标记为更新方法
上一篇 下一篇

猜你喜欢

热点阅读