I want to make a Query to get all birds in a family and I'm not sure how to do it. I've done this so far but I feel like I'm missing something:
DAO:
@Query("Select * from bird WHERE family=:family")
public LiveData<List<Bird>> getBirdsFromFamily(String family);
Repository:
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;
}
View model:
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;
}
I have a list of families and a list of birds.
When clicking on an item of the family list, I want to open a list with all the birds inside. I can get the String out of the item but nothing appears when I call the method.
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);
}
});
I resolved it with a factory - doInBackground wasn't necessary because it's only a "get" query :
DAO :
@Query("Select * from bird WHERE family=:family ORDER BY name")
public LiveData<List<Bird>> getBirdsFromFamily(String family);
Repository :
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);
}
ViewModel :
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); }
ViewModelFactory :
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);