Android Room数据库简单使用

前言

​ 最近一个项目因为大部分时间是离线使用,只在联网时提交和更新数据,所以需要用到本地数据库!之前一直用的是realm数据库,相对来说也是不错的,读写的性能还是还能很强悍的!但是最近项目完全使用了kotlin框架,而正好谷歌官方的room数据库也是使用kotlin,所以就记录下使用过程!

引入依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
dependencies {
def room_version = "2.4.2"

//必选,基本依赖
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

//可选,kotlin协程支持
implementation("androidx.room:room-ktx:$roomVersion")

// 可选 - Paging 3 Integration
implementation "androidx.room:room-paging:2.5.0-alpha01"
}
简单示例
  • 首先定义一个user实体,每个实例都代表数据库中的一行

    1
    2
    3
    4
    5
    6
    @Entity
    data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
    )
  • 定义DAO(数据访问对象)

    • 以下代码定义了一个名为 UserDao 的 DAO。UserDao 提供了应用的其余部分用于与 user 表中的数据交互的方法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @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 类的实例。
  • ```kotlin
    @Database(entities = [User::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    }
    //在单个进程中运行,在实例化 AppDatabase 对象时应遵循单例设计模式

    1
    2
    3
    4
    5
    6
    7
    8

    - 用法

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

    然后,您可以使用 AppDatabase 中的抽象方法获取 DAO 的实例,转而可以使用 DAO 实例中的方法与数据库进行交互

    1
    2
    val userDao = db.userDao()
    val users: List<User> = userDao.getAll()