美文网首页
jetpack-room 使用及原理解析

jetpack-room 使用及原理解析

作者: 付小影子 | 来源:发表于2022-06-10 16:44 被阅读0次

    Room

    Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
    利用APT注解处理器 技术 生成代码

    Room 包含三个主要组件:

    • 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
    • 数据实体,用于表示应用的数据库中的表。
    • 数据访问对象 (DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。

    @Entity

    @Entity
    data class User(
        @PrimaryKey val uid: Int,
        @ColumnInfo(name = "first_name") val firstName: String?,
        @ColumnInfo(name = "last_name") val lastName: String?
    )
    

    @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

    @Database(entities = [User::class], version = 1, exportSchema = false)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    
        companion object {
            private var instance: AppDatabase? = null
            fun getInstance(applicationContext: Context): AppDatabase {
                if (instance == null) {
                    instance = Room.databaseBuilder(
                        applicationContext,
                        AppDatabase::class.java, "database-name"
                    ).allowMainThreadQueries()
                        .build()
                }
                return instance!!
            }
        }
    }
    

    应用层

    val userDao = AppDatabase.getInstance(this).userDao()
            val user = User(1,"影影","付")
            userDao.insertAll(user)
            val users: List<User> = userDao.getAll()
            tvRoom.text = users.toString()
    

    原理解析

    Room 在编译期通过 kapt 处理 @Dao 和 @Database 注解,通过注解在运行时生成代码和SQL语句,并生成 DAO 和 Database 的实现类。

    相关文章

      网友评论

          本文标题:jetpack-room 使用及原理解析

          本文链接:https://www.haomeiwen.com/subject/nfjbmrtx.html