Android Studio Room中带参数的java查询
我想问一个问题,让所有的鸟都在一个家庭,我不知道如何做到这一点。到目前为止,我已经做到了这一点,但我觉得我遗漏了一些东西:
道:
@Query("Select * from bird WHERE family=:family")
public LiveData<List<Bird>> getBirdsFromFamily(String family);
存储库:
private LiveData<List<Bird>> allBirdsFromFamily;
private String family;
public BirdRepository(Application application){
Database database = Database.getInstance(application);
dao = database.dao();
allBirdsFromFamily = dao.getBirdsFromFamily(family);
}
public LiveData<List<Bird>> getBirdsFromFamily(String family){
return allBirdsFromFamily;
}
视图模型:
private LiveData<List<Bird>> allBirdsFromFamily;
private String family;
public BirdViewModel(@NonNull Application application) {
super(application);
birdRepository = new BirdRepository(application);
allBirdsFromFamily = birdRepository.getBirdsFromFamily(family);
}
public LiveData<List<Bird>> getAllBirdsFromFamily(String family)
{
return allBirdsFromFamily;
}
我有一份家庭名单和一份鸟类名单
当点击家族列表中的一个项目时,我想打开一个包含所有鸟类的列表。我可以从该项中获取字符串,但调用该方法时不会显示任何内容
String family = intent.getStringExtra(AddEditFamilyActivity.EXTRA_FAMILY);
birdViewModel.getAllBirdsFromFamily(family).observe(this, new Observer<List<Bird>>() {
@Override
public void onChanged(@Nullable List<Bird> birds) { //everytime something changes, the adaptater is updated
//update the recycler view
adapter.submitList(birds);
}
});
# 1 楼答案
由于我的评论有点长,我将发表一篇文章
是的,当您查询数据库时,出于两个原因希望避免使用主线程,第一个原因是因为Android会让您崩溃,告诉您不要这样做。第二种方法是让用户在获取数据的同时与应用程序交互
在本doc中,您可以查看示例和代码实验室,并学习如何正确调用数据库
# 2 楼答案
我用一个工厂解决了这个问题-没有必要使用doInBackground,因为它只是一个“get”查询:
道:
存储库:
视图模型:
ViewModelFactory:
活动: