Room是对sqlite的封装,让开发者可以更加效率的使用数据持久化保存。

一、使用方法

room_version = "2.1.0-rc01"implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version"

1、定义Entity数据类

默认表名为User,关键字为id,其他字段有nickName@Entitydata class User (    @PrimaryKey var id: Long,    var nickName: String)也可以重新定义表名,多个关键字的定义,多个外键的定义,定义不为表字段的属性@Entity(tableName="", primaryKeys = [], foreignKeys = [], ignoredColumns = [])data class User (    @PrimaryKey var id: Long,    var nickName: String)

更多定义可以查看相关注解

2、定义Dao接口类

@Daointerface UserDao {    @Insert(onConflict = OnConflictStrategy.REPLACE)    fun insert(user: User): Completable    @Query("SELECT * FROM user WHERE id = :userId")    fun query(userId: Long): Flowable@Query("SELECT * FROM user WHERE id in (:array)")    fun querySome(array: List): Flowable>}

该接口类定义了相关数据类Entity的操作函数,具体实现是由注解来做的,而我们仅需要定义就可以了,节约了很多时间,也为不熟悉数据库操作的同学提供便捷的实现方法。

3、定义Database

@Database(entities = [User::class], version = 1, exportSchema = false)abstract class MyRoomDatabase: RoomDatabase() {    abstract fun userDao(): UserDao    companion object {        @Volatile private var INSTANCE: MyRoomDatabase? = null        fun getInstance(mContext: Context): MyRoomDatabase =            INSTANCE ?: synchronized(this) {                INSTANCE ?: buildDatabase(mContext).also { INSTANCE = it }            }        private fun buildDatabase(mContext: Context) =            Room.databaseBuilder(mContext, MyRoomDatabase::class.java, "xxx.db")            // 数据库升级等时需要添加该方法                 .addMigrations(object : Migration(1, 2) {                    override fun migrate(database: SupportSQLiteDatabase) {                        // 数据库升级等                    }                })                .build()    }}

这个类主要是用来创建数据库文件、版本管理、接口引用的,同样会由注解做相关的实现。
Database注解可以配置四个属性:entities、views、version、exportSchema
entities:指的是Entity类集合
views:是DatabaseView集合
version:数据库版本
exportSchema:是否导出数据库配置文件,true则需要配置导出路径,否则异常

defaultConfig {        javaCompileOptions {            annotationProcessorOptions {                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]            }        }    }

4、使用

使用方法很简单,拿到接口引用,然后调用接口方法就行了。

MyRoomDatabase.getInstance(mContext).userDao().query(1).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe({}, {})

二、RxJava2

implementation "androidx.room:room-rxjava2:$room_version"

在定义Dao接口时,我们使用到了RxJava2的Completable和Flowable作为数据库操作的返回,因为数据库操作是不能放在UI线程的,所以这里应该使用异步,但是结果要显示又需要在UI线程,所以RxJava2是很不错的一个能很好实现异步且结果回归主线程的第三方库。

三、WorkerThread

数据库操作不能在UI线程,所以办法是在非UI线程去执行,然后在UI线程中刷新UI。

更多相关文章

  1. android 圆形头像—— android开源系列:CircleImageView自定义圆
  2. Android之——Surface、SurfaceView与SurfaceHolder.Callback初
  3. 自定义Android菜单背景
  4. android调用camera实现自定义照相
  5. 分析android的usb-gadget
  6. Android(安卓)​自定义RadioButton或CheckBox选择样式
  7. 一张图看明白 Android(安卓)Handler 消息机制
  8. android 面向对象数据库 db40使用demo
  9. 【Android】报错:Can't create handler inside thread that has n

随机推荐

  1. 字典类型
  2. 字典类型内置方法
  3. 第11部分- Linux ARM汇编 执行分支
  4. 第2部分- Linux ARM汇编ARM指令集变化和
  5. 元类(metaclass)
  6. 第3部分- Linux ARM汇编 引言
  7. 第8部分- Linux ARM汇编 定义操作
  8. 实现文件上下文管理(__enter__和__exit__
  9. __module__和__class__
  10. __format__