我正在尝试创建一个应用程序,如果在特定时间间隔内没有条目,则仅将条目添加到数据库中;如果数据库中已有条目,则修改现有条目。我正在使用 Room。
它可以工作,但只能通过解决方法,因为我必须在添加值之前调用 add 函数两次(在工作之前输入两次)。而且我也不喜欢添加观察者然后立即将其删除。我还必须在实例化数据库时实现解决方法,并在首次创建数据库时使用值。
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
我真的很感激任何建议来解决我的问题并学习更好地设计和规划我的代码。
主要 Activity
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);
}
日记 View 模型
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);
}
最佳答案
在这种情况下,您根本不应该使用LiveData
。它只是从 Activity/Fragment 观察到的数据的包装。
首先,您需要将 mEntriesToday
修改为 MutableLiveData
,以便可以更新它。
在您的情况下,您可以省略使用观察者来更新数据库,因此简单的事情如下:
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);
}
}
如果您在此类之外需要这些数据,则可以使用 getmEntriesToday()
并观察它。
关于java - 在 Repository 类中获取 LiveData 并更新数据库中的数据,无需无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742343/