美文网首页
JetPack之Room数据库框架学习

JetPack之Room数据库框架学习

作者: YC1995 | 来源:发表于2020-08-23 09:17 被阅读0次
  • Room是一个对象关系映射模型(ORM)用来操作Android自带的SQLite数据库的一个库,主要是为了简化访问Android本地数据库。
  • 框架由三个部分组成:Database、Entity、Dao

Database

Database就是代表着数据库,内部有一张张的表。

定一个数据库

@Database(entities = [User.class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
  • 定义一个抽象类,必须继承自RoomDatabase
  • 抽象类使用@DataBase注解标记
  • @DataBase注解中entities属性定义了该数据库拥有的表有哪些,version定义了数据库的版本
  • 抽象类中定义了无参的抽象方法,返回一个Dao对象(用于操作数据库中表)

Database在定义的时候上面还可以用@TypeConverters注解,用于将某个类型转换成数据库能够存储的类型,例如将某个实体类序列化转成String类型存到数据库,取的时候再反序列化

创建数据库

 mAppDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase::class.java, "app.db")
                           .build();

创建数据库的时候采用Room提供的Builder方法进行创建,就可以拿到数据库的引用。创建数据库最好设计成单例,全局只初始化一次。

数据库升级

  mAppDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase::class.java, "app.db")
                           .addMigrations(MIGRATION_1_2)
                           .build();
                           
   /**
     * 数据库版本 1->2 user表格新增了age列
     */
   private val MIGRATION_1_2: Migration = object : Migration(1, 2) {
      override fun migrate(database: SupportSQLiteDatabase) {
          atabase.execSQL("ALTER TABLE User ADD COLUMN age integer")
      }
   }

迭代的过程中升级Android本地数据库正确的做法是,在上面的@DataBase注解中升级version属性的版本号,同时在创建DB的实例的时候调用addMigrationsapi提供Migration实例进行数据迁移。

Entity

每个Entity类代表了数据库中的一张表,Entity的每个字段对应的是数据库中的一列

@Entity(tableName = "user_info")
data class User {
    @PrimaryKey
    var id = 0
    var firstName: String? = null
    var lastName: String? = null
}
  • 类用@Entity注解标记,tableName定义对应的表的表名
  • @PrimaryKey标识字段对应的列作为主键

Dao

dao层定义这操作数据库中表的CRUD的操作,注解标识的方法Room会自动生成该方法的一个实现进行数据库表的操作。

@Insert

 @Insert(onConflict = OnConflictStrategy.REPLACE)
 suspend fun insert(user: User)

onConflict属性有5个枚举的取值

  • OnConflictStrategy.REPLACE:冲突时取代旧数据同时继续事务
  • OnConflictStrategy.ROLLBACK:冲突时是回滚事务
  • OnConflictStrategy.ABORT:冲突时终止事务
  • OnConflictStrategy.FAIL:冲突时事务失败
  • OnConflictStrategy.IGNORE:冲突时忽略冲突

@Update

@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun updateUsers(vararg users: User)

Room会根据传进来的User的主键定义的值去匹配数据库表中的数据去更新对应的数据。

@Delete

@Delete(onConflict = OnConflictStrategy.REPLACE)
suspend fun deleteUsers(vararg users: User)

同样Room会根据传进来的User的主键定义的值去匹配数据库表中的数据去删除对应的数据。

@Query

@Query("SELECT * FROM user_info")
suspend fun queryAll(): List<User>

@Query("SELECT * FROM user_info WHERE firstName == :name")
suspend fun queryUsersByFirstName(name: String): List<User>

同时也可以将数据返回成LiveData提供上层进行监听。

@Query("SELECT * FROM user_info")
suspend fun queryAll(): LiveData<List<User>>

相关文章

网友评论

      本文标题:JetPack之Room数据库框架学习

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