首页 > 解决方案 > 在 Repository 类中获取 LiveData 并在无死循环的情况下更新数据库中的数据

问题描述

我正在尝试创建一个应用程序,该应用程序仅在特定时间间隔内没有条目时才将条目添加到数据库中,如果数据库中已有条目,则修改现有条目。我正在使用房间。

它可以工作,但只能使用工作方法,因为在添加值之前我必须调用 add 函数两次(在它工作之前输入两次)。而且我也不喜欢我添加观察者并在之后立即删除它。在初始化数据库时,我还必须实施解决方法,并在它首次创建时使用一个值。

如何从 Repository 类中的 LiveData List 获取数据并更改它而不会陷入无限循环,或者我如何必须重新设计我的代码以避免这种情况?

完整代码可以在我的 Github 账号上找到:Github 仓库

我非常感谢任何解决我的问题并学习更好地设计和规划我的代码的建议。

主要活动

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);

}

日记视图模型

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);


}

标签: javaandroidandroid-roomandroid-livedataobservers

解决方案


您可以使用 getValue() 方法获取 LiveData 的值

void add(Diary diary) {
       List<Diary> diaries = mEntriesToday.getValue();
       if(diaries!=null){
           diaries.get(0).addAttributes(diary);
           //update
       }else{
           //insert
       }

推荐阅读