Я пытаюсь создать приложение, которое добавляет запись в базу данных только в том случае, если в определенные промежутки времени c уже нет записи, и изменяет существующую запись, если она уже есть в базе данных. Я использую Room.
Это работает, но только с трудом, потому что мне нужно вызвать функцию add дважды, прежде чем будет добавлено значение (сделайте ввод два раза, прежде чем он заработает). И мне также не нравится, что я добавляю Обозреватель и сразу же удаляю его. Мне также пришлось применить обходной путь при создании базы данных со значением при его создании.
Как я могу получить данные из моего списка LiveData в классе Repository и изменить их, не заканчивая в итоге в бесконечном l oop или как мне изменить дизайн моего кода, чтобы избежать этого?
Полный код можно найти на моей учетной записи Github: Репозиторий Github
Я был бы очень признателен, если бы любое предложение решило мою проблему и научилось лучше проектировать и планировать свой код.
MainActivity
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);}
DiaryRepository
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);
}