androidkotlinandroid-roomandroid-livedatamediatorlivedata

Android Room combining the result of N queries into a live data list


I have a room database setup and I want to query that database N number of times and combine the results of each query into a live data array to display back to the user.

I'm pretty sure I want to be using MediatorLiveData but every example online has a predefined amount of live data sources it is combining.

I have the following setup:

petDao

    @Query("SELECT * FROM pet_table WHERE name LIKE :petName")
    fun getPetsByPetName(petName: String): LiveData<Pet>

petRepository

    fun getPetsByPetName(petNames: List<String>): LiveData<List<Pet>> {
        for (petName: String in petNames) {
            val pets = petDao.getPetsByPetName(petName)
            // Combine into one live list of pets
        }
    }

Solution

  • Have you tried this in your DAO?

    @Query("SELECT * FROM pet_table WHERE name IN (:petNames)")
    fun getPetsByPetName(petNames: List<String>): LiveData<List<Pet>>
    

    It should work with a list of up to 999 arguments. (not sure if the parameter has to be an array, or if the list is fine)

    As an extension over SQLite bind arguments, Room supports binding a list of parameters to the query. At runtime, Room will build the correct query to have matching number of bind arguments depending on the number of items in the method parameter. https://developer.android.com/reference/androidx/room/Query

    To me it seems more appropriate for the example you've given.