• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

3-6 Room数据库使用

武飞扬头像
opooooi
帮助1

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. 特性

    1. SQL语句高亮(封装原始的sqlite)

    2. 简单入门,依赖库小(相比greenDao、ObjectBox、Realm等)

    3. 功能强大

    4. 数据库监听

    5. 支持Kotlin协程/RxJava/Guava

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

  2. 常用注解

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

    • @Database 数据库的抽象类

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

      • @insert 新增

      • @update

      • @delete

      • @query --- sqlite

    其他注解

    1. @ignore 注解忽略对应字段,在数据表中的映射

    2. @index 索引字段标记

    3. @primaryKey 数据表的主键

    4. @ForeignKey 数据表的外键,确定entry表之间关系

    5. @ColumnInfo 用于数据表字段的映射定义

    6. @Embedded 用于数据表字段为外部对象的修饰,不需要那个对象也是@entity

    7. @Relation 用于多表关联

    8. @Transaction 用于数据库的事务操作标记

    9. @DatabaseView 创建虚拟数据表,而非数据库中实际的表数据,可以是多个表的部分拼接的,提高复用

    10. @TypeConverter 用于适配转换

    三部曲:

    定义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
              }
          }
      }
      学新通

二、进阶使用

数据库设计三大基本原则(三大范式)

android {
 //from dependencies.gradle
 defaultConfig{
     //只有独立运行时候才需要applicationId
     if (singleModule.toBoolean()) {
         applicationId "com.cniao5.app.common"
     }
     //生成schema文件,便于查看数据库创建表的详细信息
     javaCompileOptions {
         annotationProcessorOptions {
             arguments =["room.schemaLocation":"$projectDir/schemas".toString()]
         }
     }
 }
}
学新通
  1. 每列的原子性

  2. 每列均与主键相关

  3. 每列均与主键直接相关

  • 嵌套类

    @embedded,将额外对象的内容字段,添加到当前entry的表内,所以,其字段不可与当前entry字段重复

  • 多表联查

    1. sql语句返回数据,构建临时bean对象

    2. databaseView需要在dataBase的抽象类中@database的views添加,而后可用于在@query中使用

    3. 关联注意刷新问题,当一个表数据变化,可能引起另外一个表的刷新(解决方式:添加索引)

  • 升降级

    创建migration-->内部处理数据库迁移逻辑

    addMigrations,可多个版本迁移处理

         /**
             * 数据库的升级 迁移
             */
            val migration1_2 = object : Migration(2, 1) {//前小后大升级
                override fun migrate(database: SupportSQLiteDatabase) {
    //                database.execSQL()
    
                }

附:注意知识点

  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的优化

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfihkhk
系列文章
更多 icon
同类精品
更多 icon
继续加载