Search code examples
javaandroiddatabaseandroid-asynctaskandroid-room

Queries with arguments in Android Studio - Room


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

        });

Solution

  • 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);