我有一个使用库 Room Persistence Library 的应用。
现在我有这个问题:
我有 ViewModel :
public LiveData<List<Code>> getAllCodes() {
return codeRepository.getAllCodes();
}
在我的 codeRepository 中:
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);
}
});
}
});
但是每次将代码模型添加到我的数据库中。 那么如何从数据库中获取一次数据? 我应该创建第二个仅返回List的函数还是有一种更简洁的方法?
答案 0 :(得分:2)
在第二种情况下,您无需观察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);
}
}
});