1. 對WordDatabase使用單例模式(雙鎖懶漢式)
private static volatile WordDatabase instance = null;
static WordDatabase getInstance(Context context){
if (instance == null) {
synchronized (WordDatabase.class) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "word_database")
.build();
}
}
}
return instance;
}
2.創建倉庫WordRepository來連接dao層
import android.content.Context;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import java.util.List;
/**
* 倉庫,直接連接dao層
* 靜態內部類繼承自AsyncTask使用異步來操作數據庫
* 然後使用方法對其進行調用
*/
class WordRepository {
private WordDao wordDao;
private LiveData<List<Word>> allWordsLive;
WordRepository(Context context) {
WordDatabase wordDatabase = WordDatabase.getInstance(context);
wordDao = wordDatabase.getWordDao();
allWordsLive = wordDao.getAllWordsLive();
}
LiveData<List<Word>> getAllWordsLive() {
return allWordsLive;
}
void insertWords(Word... words) {
new InsertAsyncTask(wordDao).execute(words);
}
void updateWords(Word... words) {
new UpdateAsyncTask(wordDao).execute(words);
}
void deleteWords(Word... words) {
new DeleteAsyncTask(wordDao).execute(words);
}
void deleteAllWords() {
new DeleteAllAsyncTask(wordDao).execute();
}
static class InsertAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao wordDao;
InsertAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.insertWords(words);
return null;
}
}
static class UpdateAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao wordDao;
UpdateAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.updateWords(words);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao wordDao;
DeleteAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.deleteWords(words);
return null;
}
}
static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {
private WordDao wordDao;
DeleteAllAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Void... voids) {
wordDao.deleteAllWords();
return null;
}
}
}
3. 使用ViewModel來連接repository
public class WordViewModel extends AndroidViewModel {
private WordRepository wordRepository;
public WordViewModel(@NonNull Application application) {
super(application);
wordRepository = new WordRepository(application);
}
LiveData<List<Word>> getAllWordsLive() {
return wordRepository.getAllWordsLive();
}
void insertWords(Word... words){
wordRepository.insertWords(words);
}
void updateWords(Word... words){
wordRepository.updateWords(words);
}
void deleteWords(Word... words){
wordRepository.deleteWords(words);
}
void deleteAllWords(){
wordRepository.deleteAllWords();
}
}
4. activity中註冊viewmodel和監聽livedata
wordViewModel = ViewModelProviders.of(this).get(WordViewModel.class);
wordViewModel.getAllWordsLive().observe(this, words -> {
StringBuilder text = new StringBuilder();
for (Word word : words) {
text.append(word.getId()).append(": ").append(word.getWord()).append(" = ").append(word.getChineseMeaning()).append("\n");
}
textView.setText(text);
});