Получение LiveData внутри класса Repository и обновление данных внутри базы данных без бесконечного цикла - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать приложение, которое добавляет запись в базу данных только в том случае, если в определенные промежутки времени 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);


}

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вы не должны использовать LiveData в этом сценарии вообще. Это только оболочка для данных, которые будут наблюдаться из Activity / Fragment.

Сначала вам нужно изменить mEntriesToday на MutableLiveData, чтобы вы могли его обновить. В вашем случае вы можете не использовать Observer для обновления БД, и что-то простое, например:

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() и наблюдать за ним.

0 голосов
/ 15 января 2020

Вы можете получить значение LiveData, используя метод getValue ()

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