Android Studio 中带参数的查询 - 房间
Queries with arguments in Android Studio - Room
我想进行查询以获取一个家庭中的所有鸟类,但我不确定该怎么做。到目前为止我已经这样做了,但我觉得我错过了一些东西:
道:
@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);
}
});
由于我的评论有点长,我会做一个post。
I don't have any doInBackGround for this query, how should I do it ?
是的,当你查询数据库时你想避免使用主线程有两个原因,第一个是因为 Android 告诉你不要这样做会导致崩溃。第二个是让您的用户在您的应用程序完成获取数据的工作时与您的应用程序交互。
在此 doc 中,您可以查看示例和代码实验室,并了解如何正确调用数据库。
我用工厂解决了它 - doInBackground 不是必需的,因为它只是一个 "get" 查询:
道:
@Query("Select * from bird WHERE family=:family ORDER BY name")
public LiveData<List<Bird>> getBirdsFromFamily(String family);
存储库:
private LiveData<List<Bird>> allBirdsFromFamily;
private String family;
public BirdRepository(Application application){
Database database = Database.getInstance(application);
birdDao = database.dao();
allBirdsFromFamily = birdDao.getBirdsFromFamily(family);
}
public LiveData<List<Bird>> getAllBirdsFromFamily(String family){
return birdDao.getBirdsFromFamily(family);
}
视图模型:
private LiveData<List<Bird>> allBirdsFromFamily;
private BirdRepository repository;
public BirdViewModel(@NonNull Application application, String family ) {
super(application);
this.application = application;
repository = new BirdRepository(application);
allBirdsFromFamily = repository.getAllBirdsFromFamily(family);
}
public LiveData<List<Bird>> getAllBirdsFromFamily(String family) { return repository.getAllBirdsFromFamily(family); }
视图模型工厂:
private Application mApplication;
private String mfamily;
public BirdViewModelFactory(@NonNull Application application, String family) {
mApplication = application;
mfamily = family;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new BirdViewModel(mApplication, mfamily);
}
Activity :
BirdViewModelFactory factory = new BirdViewModelFactory(this.getApplication(), family);
birdViewModel = new ViewModelProvider(this, factory).get(BirdViewModel.class);
我想进行查询以获取一个家庭中的所有鸟类,但我不确定该怎么做。到目前为止我已经这样做了,但我觉得我错过了一些东西:
道:
@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);
}
});
由于我的评论有点长,我会做一个post。
I don't have any doInBackGround for this query, how should I do it ?
是的,当你查询数据库时你想避免使用主线程有两个原因,第一个是因为 Android 告诉你不要这样做会导致崩溃。第二个是让您的用户在您的应用程序完成获取数据的工作时与您的应用程序交互。
在此 doc 中,您可以查看示例和代码实验室,并了解如何正确调用数据库。
我用工厂解决了它 - doInBackground 不是必需的,因为它只是一个 "get" 查询:
道:
@Query("Select * from bird WHERE family=:family ORDER BY name")
public LiveData<List<Bird>> getBirdsFromFamily(String family);
存储库:
private LiveData<List<Bird>> allBirdsFromFamily;
private String family;
public BirdRepository(Application application){
Database database = Database.getInstance(application);
birdDao = database.dao();
allBirdsFromFamily = birdDao.getBirdsFromFamily(family);
}
public LiveData<List<Bird>> getAllBirdsFromFamily(String family){
return birdDao.getBirdsFromFamily(family);
}
视图模型:
private LiveData<List<Bird>> allBirdsFromFamily;
private BirdRepository repository;
public BirdViewModel(@NonNull Application application, String family ) {
super(application);
this.application = application;
repository = new BirdRepository(application);
allBirdsFromFamily = repository.getAllBirdsFromFamily(family);
}
public LiveData<List<Bird>> getAllBirdsFromFamily(String family) { return repository.getAllBirdsFromFamily(family); }
视图模型工厂:
private Application mApplication;
private String mfamily;
public BirdViewModelFactory(@NonNull Application application, String family) {
mApplication = application;
mfamily = family;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new BirdViewModel(mApplication, mfamily);
}
Activity :
BirdViewModelFactory factory = new BirdViewModelFactory(this.getApplication(), family);
birdViewModel = new ViewModelProvider(this, factory).get(BirdViewModel.class);