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集成完成