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