五分钟带你了解Android Room

1、前语

最近在开发中,Room用的比较多,时不时要查资料,干脆写一篇Room的运用和Room的封装。假如写的不好,或者有错误之处,恳请在谈论、私信、邮箱指出,万分感谢

2、增加依靠

dependencies {
    implementation "androidx.room:room-ktx:2.4.0"
}

2、Entity

Entity是指代表数据库中的表的类,能够运用注解来界说表中的列。一个Entity类应该至少有一个主键字段,并且能够包括其他字段,如下面的例子所示:

@Entity(tableName = "user")
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "email") val email: String
)

3、DAO

DAO是指数据拜访目标,用于界说拜访数据库的办法。能够运用注解来指定SQL查询,也能够运用Room供给的一些查询办法。例如,以下是一个包括一些根本查询的DAO示例:

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>
    @Query("SELECT * FROM user WHERE id = :id")
    fun getById(id: Int): User?
    @Insert
    fun insert(user: User)
    @Update
    fun update(user: User)
    @Delete
    fun delete(user: User)
}

4、Database

Database是指数据库目标,包括与数据库相关的装备信息,如版本号和实体类的列表。能够运用注解来指定数据库的装备信息和包括的实体类,如下面的例子所示:

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    companion object {
        private var INSTANCE: AppDatabase? = null
        fun getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

5、获取DAO实例

运用Database目标的实例办法获取DAO接口的实例

val db = AppDatabase.getInstance(context)
val userDao = db.userDao()

6、调用DAO办法

运用DAO接口的实例办法来拜访数据库

val users = userDao.getAll()
val user = userDao.getById(1)
val newUser = User(2, "鸡你太美", "jinitaimei@qq.com")
userDao.insert(newUser)
newUser.email = "jinitaimei@qq.com"
userDao.update(newUser)
userDao.delete(newUser)

7、运用过程

以上是Room的三个主要组成部分,下面是运用Room的一些根本过程:

  1. 增加依靠项:在项目的build.gradle文件中增加Room库的依靠项。
  2. 创立Entity类:创立一个或多个Entity类来表示数据库中的表。
  3. 创立DAO接口:创立一个或多个DAO接口来界说拜访数据库的办法。
  4. 创立Database目标:创立一个继承自RoomDatabase的抽象类来表示数据库目标,并运用@Database注解指定数据库的装备信息和包括的实体类。
  5. 获取DAO实例:运用Database目标的实例办法获取DAO接口的实例。
  6. 调用DAO办法:运用DAO接口的实例办法来拜访数据库。

下面说点其他的,嘻嘻

8、业务(Transaction)

在对数据库进行多次操作时,能够运用业务来确保数据的一致性和完整性。在Room中,能够运用@Transaction注解来指定一个办法是业务,例如:

@Transaction
fun updateUserData(user: User, address: Address) {
    userDao.update(user)
    addressDao.update(address)
}

9、数据库搬迁

当你需求修改数据库架构时,能够运用Room的数据库搬迁功能来晋级或降级数据库。在Room中,能够运用@Database注解中的version属性来指定数据库版本号,假如你需求进行搬迁,你能够创立一个Migration目标,它包括了旧版本到新版本的变化信息,并将其增加到@Database注解中的migrations属性中,例如:

@Database(entities = [User::class], version = 2, exportSchema = false,
    migrations = [Migration(1, 2) { database ->
        database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT NOT NULL DEFAULT ''")
    }]
)
abstract class AppDatabase : RoomDatabase() {
    // ...
}

10、视图(View)

在一些情况下,你或许需求运用多个表中的数据来创立一个视图(数据库视图!不是android.view)。在Room中,你能够运用@DatabaseView注解来界说一个视图,并运用@Query注解来指定视图的查询语句,例如:

@DatabaseView(
    "SELECT user.id, user.name, address.city, address.country FROM user " +
    "INNER JOIN address ON user.address_id = address.id"
)
data class UserAddress(
    val id: Int,
    val name: String,
    val city: String,
    val country: String
)
@Dao
interface UserAddressDao {
    @Query("SELECT * FROM user_address")
    fun getAll(): List<UserAddress>
}

11、Flow!

实际上也支持RXJava,可是我不喜欢RX,能够结合Room、Flow和网络恳求,做很帅的事情

@Dao
interface UserDao {
	@Query("SELECT * FROM user WHERE id = :id")
    fun getById(id: Int): Flow<User>
    @Query("SELECT * FROM user")
    fun getAll(): Flow<List<User>>
}

12、结束

实际上,Room的应用远不止如此,假如有人感兴趣的话,我就出下一期吧!比如封装一个Room的数据库层

13、感谢

  1. 校稿:ChatGpt/Bing
  2. 文笔优化:ChatGpt/Bing/秘塔写作猫

“敞开成长之旅!这是我参与「日新计划 2 月更文挑战」的第 7 天,点击检查活动概况”