Database with Room using Rxjava

作者: 小菜鸟程序媛 | 来源:发表于2017-10-10 14:58 被阅读357次

Google发布了新的开源库Room,他是属于数据库层的,可以让我们顺畅的数据库,更多相关信息可以移步官方文档
在这篇文章中,我们将使用更加优雅的方式来访问数据库,使用Rxjava来避免在UI线程中操作数据库,从而都移到后台线程中操作数据。
首先需要在build.gradle文件中引入如下的库:

// for room
compile "android.arch.persistence.room:runtime:1.0.0-beta1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-beta1"

// for Rxjava
compile "io.reactivex.rxjava2:rxjava:2.0.6"
compile "io.reactivex.rxjava2:rxandroid:2.0.1"

首先创建实体类User作为示例,最近在学Kotlin,所以把所有的代码都改成了Kotlin,如有不正确之处,欢迎指正

@Entity(tableName = "users")
class User(@ColumnInfo(name = "first_name")
           var firstName: String?, @ColumnInfo(name = "last_name")
           var lastName: String?) {
    @PrimaryKey(autoGenerate = true)
    var uid: Int = 0
}

接着我们需要一个接口UserDao:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): Maybe<List<User>>

    @Query("SELECT * FROM users WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): Flowable<List<User>>

    @Query("SELECT * FROM users WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Query("SELECT * FROM users where uid = :id")
    fun findById(id: Int): Maybe<User>

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)

    @Update
    fun updateUsers(vararg users: User)
}

接着添加AppDatabase

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

在我们的示例中,直接通过调用LocalCacheManager来访问数据库

class LocalCacheManager(private val context: Context) {
    private val db: AppDatabase

    init {
        db = Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME).build()
    }

    val users: Maybe<List<User>>
        get() = db.userDao().getAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())

    fun addUser(firstName: String, lastName: String): Completable {
        return Completable.fromAction {
            val user = User(firstName, lastName)
            db.userDao().insertAll(user)
        }.subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
    }

    fun deleteUser(user: User): Completable {
        return Completable.fromAction { db.userDao().delete(user) }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
    }


    fun updateUser(user: User): Completable {
        user.firstName = "first name first name"
        user.lastName = "last name last name"
        return Completable.fromAction { db.userDao().updateUsers(user) }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
    }

    companion object {
        private val DB_NAME = "database-name"
        private var _instance: LocalCacheManager? = null

        fun getInstance(context: Context): LocalCacheManager {
            if (_instance == null) {
                _instance = LocalCacheManager(context)
            }
            return _instance as LocalCacheManager
        }
    }
}

原示例中使用的是接口回调的方式来通知数据操作完成的,我把这里都做了一些修改。
这样,所有的操作都移到了io线程中。

原文地址:https://medium.com/@alahammad/database-with-room-using-rxjava-764ee6124974

相关文章

  • Database with Room using Rxjava

    Google发布了新的开源库Room,他是属于数据库层的,可以让我们顺畅的数据库,更多相关信息可以移步官方文档。在...

  • Room

    Save data in a local database using Room Room 提供了一个Sqlite...

  • Room database

    1,三角色(1)表:定义一个类,加上注解@Entity,类里需要定义主键,使用@PrimaryKey标识,如果主键...

  • RxJava相关

    Room ? RxJava使用RxJava操作数据库 RxPermissionsRxJava实现的Android运...

  • SQL DATABASE

    Connection to SQL Database Template using (IDbConnection ...

  • Room 🔗 RxJava

    原文地址在Room中使用RxJava进行查询 更少的模板代码,编译时SQL查询检查,除此之外,异步和响应式查询能力...

  • Android Jetpack架构组件-Room基本使用

    一、简介 Room有三个主要的组件:Database、Dao、Entity 数据库(Database):你可以使用...

  • Room Database入门指南

    说到Android端有哪些可以使用的数据库,大家首先想到的自然是SQLite这种带有官方属性加持的轻型的数据库。 ...

  • 【白水日记】Room database

    Room是Jetpack中的一个组件,处理和配置数据库的琐事,内部实现还是SQLite 数据通常使用数据类表示...

  • Android Room使用

    介绍 Room是Google提供的一个ORM库。Room提供了三个主要的组件: @Database:@Databa...

网友评论

    本文标题:Database with Room using Rxjava

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