Многочисленные возможные условия запроса области - PullRequest
0 голосов
/ 07 июня 2018

Скажем, у меня есть 3 варианта сортировки.

В классе собак есть 3 вида

  • Бульдог
  • Пудель
  • Мопс

База на 3 выбора, я думаю, у меня есть 9 комбинаций? (Не уверен).Вам нужно использовать много операторов if для сортировки и запроса результата ?Скажем на примере я хочу отобразить бульдог и пудель?или Если что-то не выбрано Мне придется показать весь список зарегистрированных собак.Что делать, если у меня есть 10 вариантов выбора с разными комбинациями.Используете ли вы заявления для всех этих?Это как 100 возможных комбинаций.Есть ли другой способ запроса области с другими возможными комбинациями?С таким количеством собак.Было бы трудно сделать, если заявления и попытаться жестко закодировать все возможные комбинации

Сценарий:

У меня есть класс собаки

class Dog : RealmObject(){
 var name:String
 var kind:String

}

, теперь в моем представлении переработчика яиметь список собак , введенных людьми.В этом люди могут просматривать собаку.Они могут запросить какой тип. Скажите, что они хотят, чтобы на экране рециркулятора были изображены пудель и мопс или хаски и пудель .Они просто отметили бы флажок пункта меню, а затем вуаля, результат хаски и пуделя показывается

Редактировать:

Я пытался использовать или и и логические операторы.Но я не могу понять, как сделать возможные комбинации.Все, что я получил, - это делать заявления, которых было бы много, так как у меня есть 5 вариантов выбора и 25 возможных комбинаций

Редактировать: Это точная проблема с моей стороны.Запрос множественной возможной комбинации в области.

Моя цель - минимизировать кодирование операторов if, полагаясь на запрос области, если это возможно

Если бы я жестко закодировал комбинацию, она бы выглядела примерно так

if(pug && husky){
 val result = realm.where(Dog::class.java).equalto("kind","husky").equalto("kind",pug").findall()
}
.
.
.
.
. a lot of ifs

1 Ответ

0 голосов
/ 07 июня 2018

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> должен нормально работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...