У меня есть приложение, в котором я использую библиотеку Библиотека сохраняемости комнаты.
Теперь у меня есть эта проблема:
У меня в 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);
}
});
}
});
Но каждый раз, когда модель кода добавляется в мою базу данных, она вызывает загрузку. Итак, как я могу получить однократные данные из моей базы данных? Должен ли я создать вторую функцию, которая возвращает просто список, или есть более чистый способ?
Честно говоря, я не понял, в чем здесь ваша проблема, не могли бы вы попытаться объяснить по-другому? Вы хотите экспортировать свои данные?
@ joao86 да, это может сработать, я попробую!
@BrunoDiegoMartins да, я хочу экспортировать свои данные
Вам не нужно соблюдать 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);
}
}
});
почему бы вам не попытаться получить коды вне onclick? Определите переменную для сохранения кодов, и поскольку у вас установлен наблюдатель, то всякий раз, когда вы вызываете переменную кодов, она всегда будет иметь самую последнюю версию списка.