一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
Room
Room 持久性库在 SQLite 的基础上提供了一个抽象层,它是 Android 官方推出的 ORM 框架,它屏蔽了数据库访问的细节,可以让开发者使用时更容易上手,并且能享有更安全健壮的数据库访问机制。
基本使用
1.导入Room
implementation "androidx.room:room-runtime:2.4.2"
implementation "androidx.room:room-ktx:2.4.2"
kapt "androidx.room:room-compiler:2.4.2"
2.创建实体类
@Entity
data class Student(
@PrimaryKey(autoGenerate = true) val uid: Int,
@ColumnInfo(name = "real_name") val realName: String?,
val age: Int?
)
| 标题 | |
|---|---|
| @Entity | 表示数据库中的表 |
| @PrimaryKey | 表示当前字段为主键,autoGenerate=true表示Room自定为实体实例分配ID |
| @ColumnInfo | 表示当前字段在数据库中的字段名 |
3.创建数据访问对象(DAO)
创建接口Dao——StudentDao,提供与 student 表中的数据交互的方法,Room给我们提供了很多方便的注解,可以让开发者无需关注SQL语句就完成简单的增删改查。如下
@Dao
abstract class StudentDao {
@Insert
abstract fun insertStudent(student: Student)
@Update
abstract fun updateStudent(student: Student)
@Delete
abstract fun deleteStudent(student: Student)
@Query("SELECT * FROM STUDENT")
abstract fun getAllStudent():List<Student>
}
| 标题 | |
|---|---|
| @Dao | 表示为访问数据库操作接口 |
| @Insert | 新增,调用 @Insert 方法时,Room 会将每个传递的实体实例插入到相应的数据库表中。 |
| @Update | 更新 |
| @Delete | 删除指定的数据 |
| @Query | 可以通过编写指定的Sql,完成从数据库中查询数据 |
4.创建AppDatabase用以保存数据库
AppDatabase由于实例成本很高,所以实例化的时候一般使用单例模式
@Database(entities = [Student::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun studentDao(): StudentDao
}
5.创建数据库管理工具
object AppDataBaseHelper {
private var dataBase: AppDataBase? = null
fun getDB(): AppDataBase {
if (null == dataBase) {
throw RuntimeException("请先init database")
}
return dataBase!!
}
fun initDb(application: Application) {
dataBase = Room.databaseBuilder(
application,
AppDataBase::class.java,
"app_db")
.build()
}
}
在Application中调用AppDataBaseHelper.initDb(application)完成初始化,之后就可以调用AppDataBaseHelper.getDB().studentDao()获取DAO完成对Student的增删改查
6.数据库升级
在很多时候,我们的表结构并不是一开始就设计的很完善,所以在版本迭代的过程中我们可能需要用到数据库升级,如下是增加Teacher表
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(
"CREATE TABLE `Teacher` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))"
)
}
}
先定义Migration,然后在上一步创建AppDataBase的地方添加addMigrations()方法,即
fun initDb(application: Application) {
dataBase = Room.databaseBuilder(
application,
AppDataBase::class.java,
"app_db")
.addMigrations(MIGRATION_1_2)
.build()
}