Android-Room(二)
39909 ワード
前編に基づいてコードを最適化します.前のデータの操作はメインスレッドに置かれています.ここでは、データベースの操作に非同期タスクを導入します.
まず(Word)bean類で、変化はありません:
Daoインタフェースは,呼び出すたびにビューを設定する必要がないようにLiveDataを導入した.
WordDatabaseは、セキュリティ上の問題のために、このオブジェクトを単一の例として書きます.
ViewModel:
WordRepository、データベースの操作から分離されたクラス:
java:
まず(Word)bean類で、変化はありません:
@Entity
public class Word {
@PrimaryKey(autoGenerate = true)// 。
private int id;
@ColumnInfo(name="english_word")//
private String word;
@ColumnInfo(name="chinese_meaning")
private String chineseMeaning;
public Word(String word, String chineseMeaning) {
this.word = word;
this.chineseMeaning = chineseMeaning;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getChineseMeaning() {
return chineseMeaning;
}
public void setChineseMeaning(String chineseMeaning) {
this.chineseMeaning = chineseMeaning;
}
}
Daoインタフェースは,呼び出すたびにビューを設定する必要がないようにLiveDataを導入した.
@Dao //Database access object
public interface WordDao {
@Insert
void insertWords(Word...words);
@Update
void updateWords(Word... words);
@Delete
void deleteWords(Word... words);
@Query("Delete From WORD")
void deleteAllWords();
@Query("Select * From Word order by id desc")
LiveData<List<Word>> getAllWordsLive();
}
WordDatabaseは、セキュリティ上の問題のために、このオブジェクトを単一の例として書きます.
//singleton
@Database(entities = {Word.class},version = 1,exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
private static WordDatabase INSTANCE;
public synchronized static WordDatabase getDatabase(Context context){
if(INSTANCE==null){
INSTANCE= Room.databaseBuilder(context.getApplicationContext(),WordDatabase.class,"word database")
.build();
}
return INSTANCE;
}
public abstract WordDao getWordDao();
}
ViewModel:
public class MyViewModel extends AndroidViewModel {
private WordRepository repository;
public MyViewModel(@NonNull Application application) {
super(application);
repository=new WordRepository(getApplication());
}
public LiveData<List<Word>> getAllWordLive() {
return repository.getAllWordLive();
}
void insertWords(Word... words){
repository.insertWords(words);
}
void updataWords(Word... words){
repository.updataWords(words);
}
void deleteWords(Word... words){
repository.deleteWords(words);
}
void DeleteAllWords(){
repository.DeleteAllWords();
}
}
WordRepository、データベースの操作から分離されたクラス:
public class WordRepository {
private WordDao wordDao;
private LiveData<List<Word>> allWordLive;
public WordRepository(Context context) {
WordDatabase wordDatabase=WordDatabase.getDatabase(context.getApplicationContext());
wordDao=wordDatabase.getWordDao();
allWordLive=wordDao.getAllWordsLive();
}
public LiveData<List<Word>> getAllWordLive() {
return allWordLive;
}
void insertWords(Word... words){
new InsertAsyncTask(wordDao).execute(words);
}
void updataWords(Word... words){
new UpdataAsyncTask(wordDao).execute(words);
}
void deleteWords(Word... words){
new DeleteAsyncTask(wordDao).execute(words);
}
void DeleteAllWords(Word... words){
new DeleteAllAsyncTask(wordDao).execute();
}
public static class InsertAsyncTask extends AsyncTask<Word,Void,Void>{
private WordDao wordDao;
public InsertAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.insertWords(words);
return null;
}
}
public static class UpdataAsyncTask extends AsyncTask<Word,Void,Void>{
private WordDao wordDao;
public UpdataAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.updateWords(words);
return null;
}
}
public static class DeleteAsyncTask extends AsyncTask<Word,Void,Void> {
private WordDao wordDao;
public DeleteAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Word... words) {
wordDao.deleteWords(words);
return null;
}
}
public static class DeleteAllAsyncTask extends AsyncTask<Void,Void,Void>{
private WordDao wordDao;
public DeleteAllAsyncTask(WordDao wordDao) {
this.wordDao = wordDao;
}
@Override
protected Void doInBackground(Void... voids) {
wordDao.deleteAllWords();
return null;
}
}
}
java:
private MyViewModel viewModel;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_room_basic);
textView=findViewById(R.id.tv_main);
viewModel=new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getAllWordLive().observe(this, new Observer<List<Word>>() {
@Override
public void onChanged(List<Word> words) {
StringBuilder text= new StringBuilder();
for(int i=0;i<words.size();i++){
Word word=words.get(i);
text.append(word.getId()).append(":").append(word.getWord()).append("+").append(word.getChineseMeaning()).append("
");
}
textView.setText(text.toString());
}
});
}
public void insert(View view){
Word word=new Word("Hello"," ");
Word word1=new Word("World", " ");
viewModel.insertWords(word,word1);
}
public void update(View view) {
Word word = new Word("Hi", " ");
word.setId(228);
viewModel.updataWords(word);
}
public void delete(View view){
Word word=new Word("Hi", " ");
word.setId(227);
viewModel.deleteWords(word);
}
public void clear(View view){
viewModel.DeleteAllWords();
}