创建数据库
将实体和 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注释类中的方法标记为更新方法 |
网友评论