1.) Если вы хотите поддерживать запрос нескольких полей, где параметры запроса строятся из данных в базе данных, вы можете использовать distinct()
и создать Set<String>
.
val kinds = realm.where<Dog>().distinct("kind").findAll().map { it.kind }.toSet()
2.)у вас есть наборы, вы можете строить запросы на основе того, что в наборе.
fun filter(realm: Realm, kinds: Set<String>): RealmResults<Dog> { // might wanna introduce a class for the sets
val query = realm.where<Dog>()
if(kinds.isNotEmpty()) {
query.beginGroup()
kinds.forEachIndexed { index, kind ->
if(index != 0) {
query.or()
}
query.equalTo("kind", kind)
}
query.endGroup()
}
return query.findAll()
}
Если вы хотите отправить в ключ сортировки, это будет просто .sort(sortKey)
.
Тогда, как вы можете видеть, вы можете обобщить эту функцию:
fun filter(realm: Realm, vararg filters: Pair<String, Set<*>>): RealmResults<Dog> {
val query = realm.where<Dog>()
fun applyFilters(query: RealmQuery<Dog>, filterParams: Pair<String, Set<*>>) {
val (fieldName, filter) = filterParams
if(filter.isNotEmpty()) {
query.beginGroup()
filter.forEachIndexed { index, value ->
if(index != 0) {
query.or()
}
query.equalTo(fieldName, value)
}
query.endGroup()
}
}
filters.forEachIndexed { index, filter ->
if(index != 0) {
query.or()
}
applyFilters(query, filter)
}
return query.findAll()
}
Где она может называться
val results = filter(realm,
"kind" to setOf("Bulldog", "Poodle"),
"name" to setOf("George"))
Но, пожалуйста, обратите внимание, что я написал это только сейчас по прихоти, такЯ мог где-то напутать.Я не уверен, что вы можете использовать Set<*>
подобным образом, но в любом случае Set<String>
должен нормально работать в вашем случае.