开启掘金成长之旅!这是我参与「掘金日新计划 · 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")
}
此外,您可以添加和使用可选功能,因此您可以添加和使用其他功能。
架构
(图片摘自 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()