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