MVVM的數據持久化(一)——ROOM的集成

MVVM框架的搭建(一)——背景java

MVVM框架的搭建(二)——項目搭建react

MVVM框架的搭建(三)——網絡請求android

MVVM的數據持久化(二)——ROOM的使用git

MVVM數據持久化

以前咱們分別介紹了MVVM框架的悲劇,項目搭建以及網絡請求,接下來在這篇文章當中,咱們來聊一聊MVVM數據持久化的問題,也就是咱們常說的緩存github

Room

Room持久庫提供了一個SQLite抽象層,讓你訪問數據庫更加穩健,提高數據庫性能。 簡介地址 developer.android.google.cn/training/da… Room在SQLite上提供了一個抽象層,以便在發揮SQLite能力的同時容許流暢的數據庫訪問,最主要的是它讓SQLiteDatabase的使用變得簡單,大大減小了重複的代碼,而且把SQL查詢的檢查放在了編譯時。並且還能夠和RxJava配合使用的十分契合。數據庫

Room有3個主要的組件
Database:

包含數據庫持有者,並充當與應用程序持久化的、關係型的數據的底層鏈接的主要訪問點。 用@Database註解的類應知足如下條件: 是一個繼承RoomDatabase的抽象類。 在註釋中包含與數據庫相關聯的實體列表。 包含一個具備0個參數的抽象方法,並返回用@Dao註釋的類。 在運行時,您能夠經過調用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()獲取數據庫實例。api

Entity:

表示數據庫內的表。緩存

DAO:

包含用於訪問數據庫的方法。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
複製代碼

方便統一管理。 至此 咱們就能夠設計新的結構圖以下:

結構圖.png

根據結構圖:

  1. View:Activity/Fragment
  2. ViewModel:使用RxJava處理數據
  3. Local Data:Room
  4. Remote Data:Retrofit

Room的使用

1.建立相應的Entity
Entity當中經常使用的幾個屬性
  1. Primary key 每一個entity必須至少定義一個field做爲主鍵(primary key)。即便只有一個field,你也必須用@PrimaryKey註釋這個field。若是你想讓Room爲entity設置自增ID,你能夠設置@PrimaryKey的autoGenerate屬性。若是你的entity有一個組合主鍵,你可使用@Entity註解的primaryKeys屬性。

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
)


複製代碼
2.建立Dao

至關於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>

}
複製代碼
3.建立數據庫

至關於建立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集成完成

項目地址

github.com/yang0range/…

相關文章
相關標籤/搜索