MVVM框架的搭建(一)——背景java
MVVM框架的搭建(二)——项目搭建react
MVVM框架的搭建(三)——网络请求android
以前咱们分别介绍了MVVM框架的悲剧,项目搭建以及网络请求,接下来在这篇文章当中,咱们来聊一聊MVVM数据持久化的问题,也就是咱们常说的缓存github
Room持久库提供了一个SQLite抽象层,让你访问数据库更加稳健,提高数据库性能。 简介地址 developer.android.google.cn/training/da… Room在SQLite上提供了一个抽象层,以便在发挥SQLite能力的同时容许流畅的数据库访问,最主要的是它让SQLiteDatabase的使用变得简单,大大减小了重复的代码,而且把SQL查询的检查放在了编译时。并且还能够和RxJava配合使用的十分契合。数据库
包含数据库持有者,并充当与应用程序持久化的、关系型的数据的底层链接的主要访问点。 用@Database注解的类应知足如下条件: 是一个继承RoomDatabase的抽象类。 在注释中包含与数据库相关联的实体列表。 包含一个具备0个参数的抽象方法,并返回用@Dao注释的类。 在运行时,您能够经过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。api
表示数据库内的表。缓存
包含用于访问数据库的方法。bash
以及这三者之间的关系图: 网络
以上简单的介绍了一下Room 下面咱们着重介绍如何在咱们的框架当中使用 首先加入依赖
implementation 'android.arch.persistence.room:runtime:1.1.1'
implementation 'android.arch.persistence.room:rxjava2:1.1.1'
kapt 'android.arch.persistence.room:compiler:1.1.1'
复制代码
看过以前文章的同窗们,能够直接放在config.gradle当中,方便统一管理。
dependVersion = [
room_version : '1.1.1'
]
roomLib = [room_runtime: "android.arch.persistence.room:runtime:$dependVersion.room_version",
room_rxjave2: "android.arch.persistence.room:rxjava2:$dependVersion.room_version"
]
room = [ room: "android.arch.persistence.room:compiler:$dependVersion.room_version"]
]
roomDeps = [roomLib.values()]
roomDep = [room.values()]
复制代码
在项目当中引用
implementation project.ext.roomDeps
kapt project.ext.roomDep
复制代码
方便统一管理。 至此 咱们就能够设计新的结构图以下:
根据结构图:
2.tableName Room默认把类名做为数据库的表名。若是你想用其它的名称,使用@Entity注解的tableName属性。
3.ColumnInfo Room默认把field名称做为数据库表的column名。若是你想让column有不同的名称,为field添加@ColumnInfo属性。
4.Indices 和 unique 为了提升查询的效率,你可能想为特定的字段创建索引。要为一个entity添加索引,在@Entity注解中添加indices属性,列出你想放在索引或者组合索引中的字段。 有时候,某个字段或者几个字段必须是惟一的。你能够经过把@Index注解的unique属性设置为true来实现惟一性。
5.Embedded 有时你可能想把一个entity或者一个POJOs做为一个总体看待,即便这个对象包含几个field。这种状况下,你可使用@Embedded注解,表示你想把一个对象分解为表的子字段。而后你就能够像其它独立字段那样查询这些嵌入的字段。
回到咱们的项目当中,建立属于咱们的Entity:
package yang.cehome.com.mvvmdemo.model.local.dao
import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey
/**
* @author yangzc
* @data 2018/11/7 10:23
* @desc 建立Post的Entity
*
*/
@Entity
data class PostEntity(
val message: String,
@PrimaryKey
val nu: String,
val ischeck: String,
val condition: String,
val com: String,
val status: String,
val state: String
)
复制代码
至关于Retrofit中的api接口。
Dao负责操做数据库的方法,也就是说咱们一些操做数据库的动做都是在这里完成的。不一样的是咱们不须要这些都用Dao类当中的注解来定义查询。
package yang.cehome.com.mvvmdemo.model.local.dao
import android.arch.persistence.room.Dao
import android.arch.persistence.room.Insert
import android.arch.persistence.room.OnConflictStrategy
import android.arch.persistence.room.Query
import io.reactivex.Single
/**
* @author yangzc
* @data 2018/11/5 17:40
* @desc PostDao
*
*/
@Dao
interface PostDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insetAll(postinfo: List<PostEntity>)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun inserttWeather(postinfo: PostEntity)
@Query("SELECT * FROM postentity")
fun getWeathInfo(): Single<PostEntity>
}
复制代码
至关于建立RetrofitClient对象。
咱们须要建立一个AppDatabase,这个类是包含了因此的Entity以及操做他们的DAO。这个类须要继承RoomDatabase的抽象类
package yang.cehome.com.mvvmdemo.model.local
import android.arch.persistence.room.Database
import android.arch.persistence.room.Room
import android.arch.persistence.room.RoomDatabase
import android.content.Context
import yang.cehome.com.mvvmdemo.model.local.dao.PostDao
import yang.cehome.com.mvvmdemo.model.local.dao.PostEntity
/**
* @author yangzc
* @data 2018/11/5 18:21
* @desc 包含全部Entity以及操做它们的 DAO
*
*/
@Database(entities = arrayOf(PostEntity::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun WeatherDao(): PostDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java, "app.db")
.build()
}
}
复制代码
Ok 至此Room集成完成