Получите данные из DAO один раз с шаблоном ViewModel RoomDatabase

У меня есть приложение, в котором я использую библиотеку Библиотека сохраняемости комнаты.

Теперь у меня есть эта проблема:

У меня в ViewModel:

public LiveData<List<Code>> getAllCodes() {
   return codeRepository.getAllCodes();
}

В моем codeRepository:

public LiveData<List<Code>> getAllCodes() {
   return appDatabase.codeDao().getAll();
}

В моем ДАО

@Query("SELECT * FROM codes ORDER BY id DESC")
LiveData<List<Code>> getAll();

Итак, в моей деятельности я могу сделать это:

codeViewModel.getAllCodes().observe(this, new Observer<List<Code>>() {
   @Override
   public void onChanged(@Nullable final List<Code> codes) {
      adapter.addItems(codes);
   }
});

И это работает, но теперь, в другом действии, я вызываю функцию, где мне нужно вызвать RoomDatabase, получить все коды и создать CSV. Моя проблема в том, что я делаю это:

 download_csv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       codeViewModel.getAllCodes().observe(this, new Observer<List<Code>>() {
          @Override
          public void onChanged(@Nullable final List<Code> codes) {
             download(codes);
          }
       });
     }
 });

Но каждый раз, когда модель кода добавляется в мою базу данных, она вызывает загрузку. Итак, как я могу получить однократные данные из моей базы данных? Должен ли я создать вторую функцию, которая возвращает просто список, или есть более чистый способ?

почему бы вам не попытаться получить коды вне onclick? Определите переменную для сохранения кодов, и поскольку у вас установлен наблюдатель, то всякий раз, когда вы вызываете переменную кодов, она всегда будет иметь самую последнюю версию списка.

joao86 09.04.2019 16:13

Честно говоря, я не понял, в чем здесь ваша проблема, не могли бы вы попытаться объяснить по-другому? Вы хотите экспортировать свои данные?

Bruno Martins 09.04.2019 16:13

@ joao86 да, это может сработать, я попробую!

LorenzoBerti 09.04.2019 16:15

@BrunoDiegoMartins да, я хочу экспортировать свои данные

LorenzoBerti 09.04.2019 16:15
0
4
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно соблюдать LiveData во втором случае, потому что это приведет к вызову метода download() каждый раз при обновлении кодов.

Если все, что вы хотите сделать, это вызвать download(), когда пользователь нажимает кнопку, сделайте следующее:

download_csv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        List<Code> codes = codeViewModel.getAllCodes().getValue();
        if (codes != null) {
            download(codes);
        }
    }
 });

Другие вопросы по теме