java - 在 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);
}
解决方案
您可以使用 getValue() 方法获取 LiveData 的值
void add(Diary diary) {
List<Diary> diaries = mEntriesToday.getValue();
if(diaries!=null){
diaries.get(0).addAttributes(diary);
//update
}else{
//insert
}
推荐阅读
- python - Pandas - 将多个值解包到另一列并合并到一个 Df 中
- python - 如何使用环境变量设置 boto3 连接超时和读取超时?
- django - 将 postgres 数据库与 heroku 连接
- python - 为什么我的 Matplotlib 子图大小不同?
- macos - mvn compile org.apache.maven.wagon.TransferFailedException:传输失败
- javascript - 开玩笑:不允许覆盖模拟方法
- javascript - 替换或模拟导入另一个文件
- java - 如何对齐添加到拆分窗格的标签和文本字段?
- java - 在java中解析一段时间后,无法通过循环解析网页中的HTML元素
- javascript - 输入新项目时如何清除和刷新搜索结果?