dependencies {
val room_version = "2.5.0"
//核心库
implementation("androidx.room:room-runtime:$room_version")
//To use Kotlin Symbol Processing (annotationProcessor/kapt/KSP)(本项目使用kapt)
kapt("androidx.room:room-compiler:$room_version")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$room_version")
// optional - RxJava2/RxJava3/Guava support for Room(本项目使用RxJava3)
implementation("androidx.room:room-rxjava3:$room_version")
// optional - Test helpers
testImplementation("androidx.room:room-testing:$room_version")
// optional - Paging 3 Integration(查询分页数据)
implementation("androidx.room:room-paging:$room_version")
}
实现示例
数据实体
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
数据访问对象 (DAO)
@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)
}
数据库
//该类必须带有 @Database 注解,该注解包含列出所有与数据库关联的数据实体的 entities 数组。
//该类必须是一个抽象类,用于扩展 RoomDatabase。
//对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。
@Database(
entities = [UserBean::class],
version = 2,
// exportSchema = false
)
abstract class TestDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
@Database(
entities = [UserBean::class],
version = 1,
exportSchema = false
)
abstract class AppDatabase() : RoomDatabase() {
companion object {
private var appDatabase: AppDatabase? = null
//单例模式
@Synchronized
open fun getInstance(context: Context): AppDatabase? {
if (appDatabase == null) {
appDatabase = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "test_app_db")
.allowMainThreadQueries() //强制要求在主线程运行(真实环境中不使用)
.addCallback(DataBaseCreateCallBack)//数据库创建回调调用
.build()
}
return appDatabase
}
private object DataBaseCreateCallBack : Callback() {
//第一次创建数据库时调用
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
LogUtils.e("first onCreate db version: " + db.version)
}
}
}
abstract fun userDao(): UserDao
}
然后,您可以使用 TestDatabase 中的抽象方法获取 DAO 的实例,转而可以使用 DAO 实例中的方法与数据库进行交互:
val userDao = db.userDao()
val users: List<User> = userDao.getAll()
错误提示:Schema export directory is not provided to the annotation processor so we cannot export the schema.You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.
解决方式一:给RoomDatabase设置exportSchema注解为false
@Database(
entities = [UserBean::class],
version = 2,
// exportSchema = false
)
abstract class TestDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}