在存储库中获取 LiveData class 并在无死循环的情况下更新数据库中的数据
Getting LiveData inside the Repository class and update the Data inside the Database without an endless loop
我正在尝试创建一个应用程序,如果在特定时间间隔内没有条目,则只向数据库添加一个条目,如果数据库中已有条目,则修改现有条目。我正在使用房间。
它可以工作,但只有一种变通方法,因为我必须在添加值之前调用 add 函数两次(在它工作之前进行两次输入)。而且我也不喜欢我添加 Observer 并在之后立即删除它。我还必须在实例化数据库时实施解决方法,并在首次创建时使用一个值。
How can I get the data from my LiveData List inside the Repository class and change it without ending up in an endless loop or how do I have to redesign my code to avoid that?
完整的代码可以在我的Github账户上找到:Github repository
如果有任何建议可以解决我的问题并学习更好地设计和规划我的代码,我将不胜感激。
主要活动
public void ok_clicked(View view) {
Intent intent = new Intent(this, DataActivity.class);
...
Diary addDiary = new Diary(new Date(), diaryCh.isChecked(), readingCh.isChecked(),writingCh.isChecked(),pianoCh.isChecked(),youtubeCh.isChecked());
mDiaryViewModel.insert(addDiary);
startActivity(intent);
}
DiaryViewModel
public void insert(Diary diary) {mRepositroy.add(diary);}
日记库
public class DiaryRepository {
private DiaryDao mDiaryDao;
private LiveData<List<Diary>> mEntriesToday;
DiaryRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mDiaryDao = db.diaryDao();
mEntriesToday = mDiaryDao.findEntriesByDate(Dates.getYesterdayMidnight(), Dates.getTomdayMidnight());
}
LiveData<List<Diary>> getmEntriesToday() { return mEntriesToday;}
void add(Diary diary) {
Observer<List<Diary>> observerEntriesToday = new Observer<List<Diary>>() {
@Override
public void onChanged(List<Diary> diaries) {
if (diaries != null) {
Log.e(TAG, "add: with matching entries"+ diaries.get(0) + " add: " + diary );
diaries.get(0).addAttributes(diary);
new updateDiaryAsyncTask(mDiaryDao).execute(diaries.get(0));
} else {
Log.e(TAG, "add: without matching entries"+" add: " + diary );
new insertDiaryAsyncTask(mDiaryDao).execute(diary);
}
}
};
getmEntriesToday().observeForever(observerEntriesToday);
getmEntriesToday().removeObserver(observerEntriesToday);
}
您可以使用 getValue() 方法获取 LiveData 的值
void add(Diary diary) {
List<Diary> diaries = mEntriesToday.getValue();
if(diaries!=null){
diaries.get(0).addAttributes(diary);
//update
}else{
//insert
}
您根本不应该在这种情况下使用 LiveData
。它只是将从 Activity/Fragment.
观察到的数据的包装器
首先您需要将mEntriesToday
修改为MutableLiveData
以便您可以更新它。
在您的情况下,您可以省略使用 Observer 更新数据库,这样简单的事情如:
void add(Diary diary){
if (mEntriesToday.getValue() != null) {
Log.e(TAG, "add: with matching entries"+ mEntriesToday.getValue().get(0) + " add: " + diary );
mEntriesToday.getValue().get(0).addAttributes(diary);
new updateDiaryAsyncTask(mDiaryDao).execute(mEntriesToday.getValue().get(0));
} else {
Log.e(TAG, "add: without matching entries"+" add: " + diary );
new insertDiaryAsyncTask(mDiaryDao).execute(diary);
}
}
如果你需要这个class之外的数据,那么你可以使用getmEntriesToday()
并观察它。
我正在尝试创建一个应用程序,如果在特定时间间隔内没有条目,则只向数据库添加一个条目,如果数据库中已有条目,则修改现有条目。我正在使用房间。
它可以工作,但只有一种变通方法,因为我必须在添加值之前调用 add 函数两次(在它工作之前进行两次输入)。而且我也不喜欢我添加 Observer 并在之后立即删除它。我还必须在实例化数据库时实施解决方法,并在首次创建时使用一个值。
How can I get the data from my LiveData List inside the Repository class and change it without ending up in an endless loop or how do I have to redesign my code to avoid that?
完整的代码可以在我的Github账户上找到:Github repository
如果有任何建议可以解决我的问题并学习更好地设计和规划我的代码,我将不胜感激。
主要活动
public void ok_clicked(View view) {
Intent intent = new Intent(this, DataActivity.class);
...
Diary addDiary = new Diary(new Date(), diaryCh.isChecked(), readingCh.isChecked(),writingCh.isChecked(),pianoCh.isChecked(),youtubeCh.isChecked());
mDiaryViewModel.insert(addDiary);
startActivity(intent);
}
DiaryViewModel
public void insert(Diary diary) {mRepositroy.add(diary);}
日记库
public class DiaryRepository {
private DiaryDao mDiaryDao;
private LiveData<List<Diary>> mEntriesToday;
DiaryRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mDiaryDao = db.diaryDao();
mEntriesToday = mDiaryDao.findEntriesByDate(Dates.getYesterdayMidnight(), Dates.getTomdayMidnight());
}
LiveData<List<Diary>> getmEntriesToday() { return mEntriesToday;}
void add(Diary diary) {
Observer<List<Diary>> observerEntriesToday = new Observer<List<Diary>>() {
@Override
public void onChanged(List<Diary> diaries) {
if (diaries != null) {
Log.e(TAG, "add: with matching entries"+ diaries.get(0) + " add: " + diary );
diaries.get(0).addAttributes(diary);
new updateDiaryAsyncTask(mDiaryDao).execute(diaries.get(0));
} else {
Log.e(TAG, "add: without matching entries"+" add: " + diary );
new insertDiaryAsyncTask(mDiaryDao).execute(diary);
}
}
};
getmEntriesToday().observeForever(observerEntriesToday);
getmEntriesToday().removeObserver(observerEntriesToday);
}
您可以使用 getValue() 方法获取 LiveData 的值
void add(Diary diary) {
List<Diary> diaries = mEntriesToday.getValue();
if(diaries!=null){
diaries.get(0).addAttributes(diary);
//update
}else{
//insert
}
您根本不应该在这种情况下使用 LiveData
。它只是将从 Activity/Fragment.
首先您需要将mEntriesToday
修改为MutableLiveData
以便您可以更新它。
在您的情况下,您可以省略使用 Observer 更新数据库,这样简单的事情如:
void add(Diary diary){
if (mEntriesToday.getValue() != null) {
Log.e(TAG, "add: with matching entries"+ mEntriesToday.getValue().get(0) + " add: " + diary );
mEntriesToday.getValue().get(0).addAttributes(diary);
new updateDiaryAsyncTask(mDiaryDao).execute(mEntriesToday.getValue().get(0));
} else {
Log.e(TAG, "add: without matching entries"+" add: " + diary );
new insertDiaryAsyncTask(mDiaryDao).execute(diary);
}
}
如果你需要这个class之外的数据,那么你可以使用getmEntriesToday()
并观察它。