java - 在 Repository 类中获取 LiveData 并更新数据库中的数据,无需无限循环

标签 java android android-room android-livedata observers

我正在尝试创建一个应用程序,如果在特定时间间隔内没有条目,则仅将条目添加到数据库中;如果数据库中已有条目,则修改现有条目。我正在使用 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/

相关文章:

java - 为什么这个 Java TCP 客户端/服务器不起作用?

android - buildSrc 中自定义 gradle 插件中的类不会打包到 apk 中

android - 即使重新安装后,ROOM 数据库中的数据也不会被删除

java - 如何从房间数据库读取所有值并显示到recyclerview中?

java - 在 kotlin 中首次构建 Room 数据库时如何修复异常

java - Android Toast 消息未在第一次请求时出现

java - 添加计数器,该计数器在每次 http 请求时都会增加

java - 如何在 Maven 3 站点插件中禁用测试 Javadoc 报告的生成?

android - 长按,上下文菜单

android - UnregisterListener 不适用于 PROXIMITY_SCREEN_OFF_WAKE_LOCK