Область (Android / Kotlin) - Как выполнить запрос, который позволяет проверить, все ли объекты совпадают как часть значений в массиве значений - PullRequest
0 голосов
/ 21 сентября 2018

Контекст:

  1. Некоторое содержимое (лист, категория и т. Д.) Защищено группами.(Класс содержимого имеет 2 списка RealmList групп, первый "groupsOneOf" и второй "groupsAllOf")
  2. Пользователи могут быть в группах (у пользователя есть один RealmList "groups")
  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
}

В настоящее время я выполняю пост-фильтр, когда получаю RealmResults для groupsAllOf:

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: /

Некоторая помощь будет принята с благодарностью.

...