本篇介绍Room的简单使用,不涉及数据库升级;内容包括gradle配置、依赖、数据库增删改。
一、App Gradle配置
gradle配置主要是添加room依赖
gradle.kts
plugins {
//org.jetbrains.kotlin.android:1.9.0
alias(libs.plugins.kotlin.android)
//com.google.devtools.ksp:1.9.0-1.0.13
alias(libs.plugins.kotlin.ksp)
}
dependencies {
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
// If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
// See Add the KSP plugin to your project
ksp("androidx.room:room-compiler:$room_version")
// If this project only uses Java source, use the Java annotationProcessor
// No additional plugins are necessary
annotationProcessor("androidx.room:room-compiler:$room_version")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$room_version")
}
二、创建数据库实体类
一个实体类对应一个数据表,在类上加上@Entiry
表示
kotlin
@Entity
data class Wong(
val userName: String,
val age: Int,
// 在数据库中0表示false,1表示true
val isGirl: Boolean = false
) {
//必须要指定 PrimaryKey
@PrimaryKey(autoGenerate = true)
var id: Long = 0
}
三、创建数据库Dao
创建增删改查工具接口类,类上加@Dao
表示,在每个增删改查方法上加上对应的注解:@Insert
、@Delete
、@Update
、Query
。 注意Dao是个接口。
kotlin
@Dao
interface WongDao {
@Insert
fun insert(wong: Wong)
@Insert
fun insert(vararg wong: Wong)
@Insert
fun insert(wong: List<Wong>)
/**
* 返回0表示删除失败
* 只会拿id去匹配
*/
@Delete
fun delete(wong: Wong): Int
@Update
fun update(wong: Wong)
@Query("SELECT * FROM wong")
fun getAll(): List<Wong>
}
四、创建数据库Database
这个类用于创建Dao和数据库升级,是个抽象类,继承自RoomDatabase
,每个表Dao对应一个抽象方法; 通过Room.databaseBuilder(context, AppDatabase::class.java, "my-db").build()
方法获取当前数据库对象;
kotlin
@Database(entities = [Wong::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
//每个表对应一个抽象方法
abstract fun wongDao(): WongDao
companion object {
// [这里instance是官方demo的写法](https://github.com/android/sunflower)
@Volatile
private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
return instance ?: synchronized(this) {
instance ?: buildDatabase(context).also { instance = it }
}
}
private fun buildDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "my-db")
.build()
}
}
}