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

框架
數(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é)