Room 框架是 Android 官方推出一款数据库操作框架,里面封装了对于 Sqlite 的操作,可以快速、便捷的完成相关操作。今天我们就来了解并学习下这块库的使用和原理。
上手使用
添加依赖
我们首先添加依赖,我这里用的版本是2.3.0
,然后在项目的build.gradle
文件内添加依赖,如果没有配置kapt
处理器还需要添加kotlin-kapt
插件。添加完成后同步即可。
plugins{
//...
id 'kotlin-kapt'
}
dependencies{
def room_version = "2.3.0"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor "androidx.room:room-compiler:$room_version"
// To use Kotlin annotation processing tool (kapt)
kapt("androidx.room:room-compiler:$room_version")
// To use Kotlin Symbolic Processing (KSP)
// 这里的 ksp 是取代 kapt 的一种方式,这里暂时不用
// ksp("androidx.room:room-compiler:$room_version")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$room_version")
}
实际使用
等待配置同步完成后,我们就可以开始使用了。因为 Room 是一个 ORM 类型的数据库框架,所以第一步我们要先定义一个实体类,这个类也就会映射成数据库中的一张表。我们新建一个User
类。
@Entity(tableName = "user")
data class User(
@PrimaryKey
val uid: Int,
@ColumnInfo(name = "first_name")
val firstName: String?,
@ColumnInfo(name = "last_name")
val lastName: String?
)
我们可以看到这里面使用了注解,其中@Entity
标识这个类是数据库中的一个实体类,PrimaryKey
标识主键,@ColumnInfo
标识列信息。
这样就等于我们有了user
这张表了,接着我们就需要定义对这张表进行操作的UserDao
。我们的增删改查逻辑都会定义在里面。这里面也是通过注解的形式来实现的,比如查询语句,通过@Query("SELECT * FROM user")
就可以完成。
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
有了表定义和操作逻辑后,我们就可以定义我们的数据库操作了,新建一个AppDatabase
类继承RoomDatabase
。这里面通过注解标识关联的实体类@Database(entities = [User::class], version = 1, exportSchema = false)
接着声明需要操作的abstract fun userDao(): UserDao
,最后提供一个单例的调用方法。
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java, "main_database"
).build()
INSTANCE = instance
instance
}
}
}
}
到这里,我们需要的代码已经完成了,接着我们执行插入和查询操作。**要注意对应的数据库操作都需要在非主线程进行。**我们获取到dao
就可以进行对应的操作了。
ThreadUtils.executeByIo(object : ThreadUtils.SimpleTask<User>() {
override fun doInBackground(): User {
val uid = Random(System.currentTimeMillis()).nextInt()
val user = User(uid, "FirstName$uid", "LastName$uid")
appDatabase.userDao().insertAll(user)
return user
}
override fun onSuccess(result: User) {
ToastUtils.showLong("插入成功" + GsonUtils.toJson(result))
}
})
到这里,我们就完成了最简单的使用实践。