首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多位置条件领域查询

多位置条件领域查询
EN

Stack Overflow用户
提问于 2018-06-07 11:42:33
回答 1查看 1.1K关注 0票数 2

假设我有三种分类选择。

狗类有3种

  • 斗牛犬
  • 贵宾犬
  • 帕格

基于3个选择,我想我有9个组合?(不确定)。您是否必须使用很多if语句来对结果进行排序和查询?比方说,我想在上展示牛头犬和贵宾狗?或者,如果没有被选中的话,,我将不得不显示所有已注册狗的列表。如果我有10个选择与不同的组合选择。所有这些语句都使用if语句吗?这相当于100种可能的组合。是否有其他方法可以使用其他可能的组合查询领域?有这么多种狗在外面。如果语句并尝试硬编码所有可能的组合,将很难做到。

设想情况:

我有一节狗课

代码语言:javascript
复制
class Dog : RealmObject(){
 var name:String
 var kind:String

}

现在,在我的回收商的观点,我有一个名单的狗,输入的人。这样人们就可以浏览狗了。他们可以问什么类型。说,他们希望回收者的视角显示出一只贵宾犬和一只小狗,或者一只哈士奇和一只贵宾狗。他们只需检查菜单项复选框,然后查看哈士奇和贵宾犬的结果。

编辑:

我尝试使用逻辑运算符。但我不知道怎么做可能的组合。我所得到的只是if语句,这将是很多,因为我有5个选择和25个可能的组合。

编辑:这正是我的问题所在。领域上的多个可能的组合查询。

我的目标是尽可能减少if语句的编码,方法是在可能的情况下依赖领域查询

如果我硬编码密码,它看起来会像这样

代码语言:javascript
复制
if(pug && husky){
 val result = realm.where(Dog::class.java).equalto("kind","husky").equalto("kind",pug").findall()
}
.
.
.
.
. a lot of ifs
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 12:04:14

1.)如果希望支持从数据库中的数据生成查询选项的多个字段查询,则可以使用distinct()并创建Set<String>

代码语言:javascript
复制
val kinds = realm.where<Dog>().distinct("kind").findAll().map { it.kind }.toSet()

2.)一旦有了集合,就可以根据集合中的内容构建查询。

代码语言:javascript
复制
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)

然后,如您所见,可以泛化此函数:

代码语言:javascript
复制
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()
}

在那里可以被称为

代码语言:javascript
复制
val results = filter(realm, 
                "kind" to setOf("Bulldog", "Poodle"), 
                "name" to setOf("George"))

但请注意,我刚才写这个只是一时兴起,所以我可能在某个地方搞砸了。我不确定您是否可以这样使用Set<*>,但是Set<String>在用例中应该工作得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50740310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档