[Android] Room 使用

220 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

这一次,在一个人做项目的时候,我引入了 Room。我提到的项目是android提供的sunflower。本来想介绍realm的,后来看了其他公司找工作,好像用room的地方很多,所以先看这个。之前,我一直使用SQLite直接存储数据。直接把query写成字符串后,有很多后处理,比如重新组合数据。ROOM 提供以下功能来减少这种繁琐的过程

  • SQL错误时的编译错误,便于查找错误
  • 尽量减少重复和容易出错的样板文件
  • 数据库迁移路径

构建.gradle

你需要添加到 gradle 中的最基本的部分是:

dependencies {
    implementation("androidx.room:room-ktx:2.4.3")
    kapt("androidx.room:room-compiler:2.4.3")
}

此外,您可以添加和使用可选功能,因此您可以添加和使用其他功能。

架构

image.png (图片摘自 Android developer)

数据库类

  • 有一个数据库
  • 具有持久数据的主连接接入点
@Database(entities = [Book::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun bookDao(): BookDao
}
  • @Database应包含带注释的实体数组
  • 必须是扩展 RoomDatabase 的抽象类
  • 在实例化单个进程瞬态 AppDatabase 对象时,应使用单例设计模式创建它。
  • Room 是资源密集型的,所以你很少需要在单个进程中访问它。如果你需要在多个进程中运行它,enableMultiInstanceInvalidation()你可以通过在构建器调用中包含它来使共享数据库文件无效,它会自动传播到 appDatabase 实例在其他进程中。

数据项

  • 数据库表
@Entity
data class Book(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String?,
    @ColumnInfo(name = "price") val price: String?
)
  • @Entity必须定义为带注释的类
  • 必须包含构成主键 (@primarykeys) 的一个或多个字段。
  • 要具有不同的列名称,请将 columnInfo 注释添加到该字段并设置名称属性。
  • 您可以使用@Ignore 来忽略字段。

数据访问对象

  • 提供查询、更新、插入、删除方法
@Dao
interface BookDao {
    @Query("SELECT * FROM book")
    fun getAll(): List<Book>

    @Query("SELECT * FROM book WHERE id IN (:bookids)")
    fun loadAllByIds(bookids: IntArray): List<Book>

    @Query("SELECT * FROM book WHERE name LIKE :name LIMIT 1")
    fun findByName(name: String): Book

    @Insert
    fun insertAll(vararg book: Book)

    @Delete
    fun delete(book: Book)
}
  • 便捷方法:不用写SQL就可以插入、更新、删除行。

    • @Insert - 定义从数据库插入参数的方法
    • @Update - 定义更新特定行的方法
    • @Delete - 定义删除特定行的方法
  • 查询方式:写SQL访问数据

    • 当您需要执行比便捷方法更复杂的插入、删除或修改时使用。
    • 在编译时验证 SQL 查询
    • 如果查询有问题,则会出现编译错误。

采用

val db = Room.databaseBuilder(applicationContext,
    AppDatabase::class.java, "database-name")
    .build()

您可以通过将 DAO 导入 AppDatabase 的抽象方法来与数据库交互。

val bookDao = db.bookDao()
val books: List<Book> = bookDao.getAll()