0
点赞
收藏
分享

微信扫一扫

3-6 Room数据库使用详解

静鸡鸡的JC 2022-01-25 阅读 59

Room数据库使用详解

一、基础使用

  1. 依赖库

    implementation 'androidx.room:room-runtime:2.2.5'
    implementation 'androidx.room:room-common:2.2.5'
    implementation 'androidx.room:room-ktx:2.2.5'
    kapt "androidx.room:room-compiler:2.2.5"//class DbUser和接口UserDao关联起来
//额外的还有rxjava2、guava的支持包
  1. 特性

    不足:性能对比其他优秀数据库框架,并无优势;对于ORM的支持不是很好

  2. 常用注解

    • @Entity 修饰 数据表实体类(内部至少有一个primaryKey标记的字段)

    • @Database 数据库的抽象类

    • @Dao 用于操作数据表的Dao接口

      • @insert 新增

      • @update

      • @delete

      • @query --- sqlite

    三部曲:

    定义class

    1. * 临时演示的demo的entity
      */
      @Entity(tableName = "db_user") //room数据库的注解标记,数据表entity  (tableName="db_user",indices = {@Index(value = "uname",unique = true)})
      class DbUser {
          @PrimaryKey(autoGenerate = true)
          var uid = 0
      ​
          @ColumnInfo(name = "uname")
          var name: String? = null
      ​
          var city: String? = null
      ​
          var age = 0
      ​
          //如此数据表中不会有@Ignore标记的属性字段
          @Ignore
          var isSingle = false
      ​
          override fun toString(): String {
              return "DbUser{" +
                      "uid=" + uid +
                      ", name='" + name + '\'' +
                      ", city='" + city + '\'' +
                      ", age=" + age +
                      ", single=" + isSingle +
                      '}'
          }
      }
    2. * ----------------------------------------------------------------
      * demo演示的dao接口文件
      */
         
      @Dao
      interface UserDao {
          //查询所有数据,若返回liveData则为 LiveData<List<DbUser>>
          @Query(value = "select * from db_user")
          fun getAll(): List<DbUser?>?
      ​
          @Query("SELECT * FROM db_user WHERE uid IN (:userIds)")
          fun loadAllByIds(userIds: IntArray?): List<DbUser?>? //根据uid查询
      ​
          @Query(
              "SELECT * FROM db_user WHERE uname LIKE :name AND "
                      + "age LIKE :age LIMIT 1"
          )
          fun findByName(name: String?, age: Int): DbUser?
      ​
          @Query("select * from db_user where uid like :id")
          fun getUserById(id: Int): DbUser?
      ​
          @Insert
          fun insertAll(vararg users: DbUser?) //支持可变参数
      ​
          @Delete
          fun delete(user: DbUser?) //删除指定的user
      ​
          @Update(onConflict = OnConflictStrategy.REPLACE)
          fun update(user: DbUser?) //更新,若出现冲突,则使用替换策略,还有其他策略可选择
      }
    3. * room数据库的dataBase抽象类
       */
      @Database(entities = [DbUser::class], version = 1, exportSchema = false)
      abstract class UserDatabase : RoomDatabase() {
          abstract val userDao: UserDao?
      ​
          companion object {
              const val DB_NAME = "user.db"
              private var instance: UserDatabase? = null
      ​
              @Synchronized
              fun getInstance(context: Context?): UserDatabase? {
                  if (instance == null) {
                      instance = Room.databaseBuilder(
                          context!!,
                          UserDatabase::class.java,
                          DB_NAME
                      )
                          .allowMainThreadQueries() //默认room不允许在主线程操作数据库,这里设置允许
                          .build()
                  }
                  return instance
              }
          }
      }

二、进阶使用

  • 嵌套类

  • 多表联查

  • 升降级

附:注意知识点

  1. entry必须非private构造函数,字段不能private

    1. 默认不允许主线程操作,可手动添加allowMainThreadQueries

    2. 使用room结合liveData时候,返回数据可能null

      1. @embeded的挂载,字段避免重复

      2. 创建Dao可以是interface,也可以abstract class ,但是抽象类的时候,所有函数都必须是抽象函数

      3. AS中 java(generated)目录下,可查看插件生成的java代码。dao的操作都是事务性的。

      4. 外键的使用,注意索引index的优化

举报

相关推荐

0 条评论