Получение данных из DAO один раз с помощью ViewModel pattern RoomDatabase

#android #android-room

#Android #android-комната

Вопрос:

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

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

У меня в моей ViewModel:

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

В моем хранилище кода:

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

В моем DAO

 @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);
          }
       });
     }
 });
  

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

Комментарии:

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

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

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

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

Ответ №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);
        }
    }
 });