假设我有三种分类选择。
狗类有3种
基于3个选择,我想我有9个组合?(不确定)。您是否必须使用很多if语句来对结果进行排序和查询?比方说,我想在上展示牛头犬和贵宾狗?或者,如果没有被选中的话,,我将不得不显示所有已注册狗的列表。如果我有10个选择与不同的组合选择。所有这些语句都使用if语句吗?这相当于100种可能的组合。是否有其他方法可以使用其他可能的组合查询领域?有这么多种狗在外面。如果语句并尝试硬编码所有可能的组合,将很难做到。
设想情况:
我有一节狗课
class Dog : RealmObject(){
var name:String
var kind:String
}现在,在我的回收商的观点,我有一个名单的狗,输入的人。这样人们就可以浏览狗了。他们可以问什么类型。说,他们希望回收者的视角显示出一只贵宾犬和一只小狗,或者一只哈士奇和一只贵宾狗。他们只需检查菜单项复选框,然后查看哈士奇和贵宾犬的结果。
编辑:
我尝试使用或、和逻辑运算符。但我不知道怎么做可能的组合。我所得到的只是if语句,这将是很多,因为我有5个选择和25个可能的组合。
编辑:这正是我的问题所在。领域上的多个可能的组合查询。
我的目标是尽可能减少if语句的编码,方法是在可能的情况下依赖领域查询
如果我硬编码密码,它看起来会像这样
if(pug && husky){
val result = realm.where(Dog::class.java).equalto("kind","husky").equalto("kind",pug").findall()
}
.
.
.
.
. a lot of ifs发布于 2018-06-07 12:04:14
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>在用例中应该工作得很好。
https://stackoverflow.com/questions/50740310
复制相似问题