Android:ROOM數(shù)據(jù)庫框架

ROOM

ROOM對Sqlite進行了封裝,直接使用ROOM來進行數(shù)據(jù)庫訪問。

代碼:https://github.com/Gong-Shijie/RoomDemo

ROOM數(shù)據(jù)庫查詢可以直接返回LiveData對象,每次CRUD都會自動更新該LiveData,LiveData始終是數(shù)據(jù)庫最新值

利用該特性可以直接將數(shù)據(jù)庫的變化,通過LiveData作為觀察者傳遞到ViewModel,保證拿到的數(shù)據(jù)都是數(shù)據(jù)庫中時刻最新的值

使用流程:

Entry類-->Dao-->EntryRoomDatabase(單例模式)-->Repository(從EntryRoomDatabase獲得Dao)-->在Repository中實現(xiàn)異步-->AndroidViewModel通過Repository訪問數(shù)據(jù)庫CRUD


資料:https://codelabs.developers.google.com/codelabs/android-room-with-a-view/index.html?index=..%2F..index#0

框架

數(shù)據(jù)庫操作不應(yīng)該在MainThread中,所以我們使用AsyncTask來進行數(shù)據(jù)庫操作。
詳細設(shè)計

UI層(Activity和Fragment)所有的數(shù)據(jù)應(yīng)該都直接從ViewModel來獲取,在ViewModel中我們使用AsyncTask來進行數(shù)據(jù)庫操作。
ROOM進行數(shù)據(jù)庫操作依賴于Dao接口,在該接口中實現(xiàn)了很多數(shù)據(jù)庫操作。


主要角色

  • Entry 實體類
  • Dao 定義接口數(shù)據(jù)庫操作
  • 繼承RoomDatabase 通過ROOM實例化database返回Dao供調(diào)用
  • 異步類調(diào)用Dao中數(shù)據(jù)庫操作如AsyncTask
  • Repository對操作進行封裝
  • AndroidViewModel 聚合 Repository來執(zhí)行數(shù)據(jù)庫操作

使用方法

工程結(jié)構(gòu)

Entry類-->Dao-->EntryRoomDatabase(單例模式)-->Repository(從EntryRoomDatabase獲得Dao)-->在Repository中實現(xiàn)異步-->AndroidViewModel通過Repository訪問數(shù)據(jù)庫CRUD


代碼實現(xiàn)

Entry

@Entity
public class Word {
    @PrimaryKey(autoGenerate = true)
    private int id;
    @ColumnInfo(name = "english")
    private String english;
    @ColumnInfo(name = "chinese")
    private String mean;
    public Word(String english, String mean) {
        this.english = english;
        this.mean = mean;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEnglish() {
        return english;
    }
    public void setEnglish(String english) {
        this.english = english;
    }
    public String getMean() {
        return mean;
    }
    public void setMean(String mean) {
        this.mean = mean;
    }
}

Dao


@Dao
public interface WordDao {
    @Insert
    void insertWord(Word... words);

    @Update
    void update(Word... words);
    @Delete
    void delete(Word... words);
    @Query("DELETE FROM WORD")
    void deleteAll();
    @Query("SELECT * FROM WORD ORDER BY ID DESC")
    LiveData<List<Word>> getAll();
}

WordRoomDatabase


@Database(entities = {Word.class},version = 1,exportSchema = false)
public abstract  class WordRoomDatabase extends RoomDatabase {
    public abstract WordDao getWordDao();
    private static  WordRoomDatabase INSTANCE;
    public  static  WordRoomDatabase getInstance(final Context context) {
        if (INSTANCE == null) {
            synchronized (WordRoomDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            WordRoomDatabase.class, "word_database")
                            .build();
                }
            }
        }
        return INSTANCE;
    }
}

Repository


public class Repository {
    private LiveData<List<Word>> wordsLive;

    public LiveData<List<Word>> getWordsLive() {
        return wordsLive;
    }

    //用來調(diào)用數(shù)據(jù)庫操作
    private WordDao wordDao;

    public Repository(Context context) {
        WordRoomDatabase wordRoomDatabase = WordRoomDatabase.getInstance(context.getApplicationContext());
        wordDao = wordRoomDatabase.getWordDao();
        wordsLive = wordDao.getAll();
    }
   public   void insert(Word... words){
        new InsertTask(wordDao).execute(words);
    }
   public    void delete(Word... words){
        new DeleteTask(wordDao).execute(words);
    }
   public    void update(Word... words){
        new UpdateTask(wordDao).execute(words);
    }
   public   void deleteAll(){
        new DeleteAllTask(wordDao).execute();
    }
}

VeiwModel


public class MainViewModel extends AndroidViewModel {
    // ViewModel 沒有很好的方法來獲得一個Context 需要繼承AndroidViewModel
    Repository repository;
    public MainViewModel(Application application) {
        super(application);
        this.repository = new Repository(application);
    }
  public   LiveData<List<Word>> getAll(){
        return repository.getWordsLive();
    }
   public void insert(Word... words){
        repository.insert(words);
    }
   public void update(Word... words){
        repository.update(words);
    }
   public void delete(Word... words){
        repository.delete(words);
    }
   public void deleteAll(){
        repository.deleteAll();
    }
}

總結(jié)

總結(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容