领域(Android / Kotlin)-如何执行查询,该查询可让您测试是否所有对象都匹配为值数组中值的一部分

时间:2018-09-21 08:34:00

标签: android realm realm-list

上下文:

  1. 某些内容(表格,类别等)受组保护。 (内容类有2个RealmLists组,第一个是“ groupsOneOf”,第二个是“ groupsAllOf”)
  2. 用户可以成组(用户具有一个RealmList“组”)
  3. 某些内容仅对至少属于该内容组之一的用户可用。
  4. 某些内容仅对属于所有内容组中的用户可用。

对于“至少在内容组中的一个”中,在文档中找到了'in'运算符:

  

这允许您测试对象是否匹配值数组中的任何值。

但是第二,没有办法执行这种查询。我在其他帖子中搜索了解决方案,但有些人似乎说目前不支持该解决方案。在iOS中,它似乎可以在NSPredicate中使用,但在Java中不可用。

这是我的代码:

fun <E: RealmObject> RealmQuery<E>.groupsAllowed(): RealmQuery<E>{
    val userGroupsIds = realm.queryUserConnected()?.findFirst()?.groups?.toGroupIds()
    if(userGroupsIds == null || userGroupsIds.isEmpty()){
        isEmpty("groupsAllOf")
        isEmpty("groupsOneOf")
    }else{
        beginGroup()
            beginGroup()
                isEmpty("groupsOneOf")
                or()
                `in`("groupsOneOf.id", userGroupsIds.toTypedArray())
            endGroup()
            //beginGroup()
                //isEmpty("groupsAllOf")
                //or()
                //TODO
            //endGroup()
        endGroup()
    }
    return this
}

当前,当我获得groupsAllOf的RealmResults时,我正在执行后置过滤器:

fun <E: RealmObject> E.groupsAllowed(userGroupIds: List<String>): E?{
    val groupsAllOf: RealmList<Group>? = when(this){
        is Sheet -> groupsAllOf
        is Category -> groupsAllOf
        else -> null
    }
    if(groupsAllOf == null || groupsAllOf.isEmpty()){
        return this
    }else{
        return if(userGroupIds.containsAll(groupsAllOf.toGroupIds())) this else null
    }
}

fun <E: RealmObject> RealmResults<E>.groupsAllowed(): List<E>{
    val userGroupIds = realm.queryUserConnected().findFirst()?.groups?.toGroupIds()?: emptyList()
    val listAllowed = arrayListOf<E>()
    this.forEach { it.groupsAllowed(userGroupIds)?.let { contentAllowed ->  listAllowed.add(contentAllowed) } }
    return listAllowed
}

fun RealmList<Group>.toGroupIds(): List<String> = arrayListOf<String>().apply { this@toGroupIds.forEach { group -> this.add(group.id) } }

但这很烦人,因为当我获得RealmResults时,我不得不忘记调用此函数:/

我们将不胜感激。

0 个答案:

没有答案