Мы должны хранить элементы в Realm, которые имеют массив строковых полей.
Для этого нам нужно внедрить небольшой обходной путь:
class RealmString: Object {
@objc dynamic var value = ""
override init(value: Any) {
super.init(value: [value])
}
required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
required init() {
super.init()
}
required init(value: Any, schema: RLMSchema) {
super.init(value: [value], schema: schema)
}
}
class Realm2Element: Object {
let tags = List<RealmString>()
}
В результате:
- СОДЕРЖИТ ВСЕ ОТ условие выглядит так:
ANY tags.value == "tag0" AND ANY tags.value == "tag1" AND ANY tags.value == "tag2"
- СОДЕРЖИТ ЛЮБОЕ из условие выглядит так:
ANY tags.value IN {"tag0", "tag1", "tag2"}
Realm3 поддерживает массив примитивов. Мы удалили .value
keyPath из условия. Но мы получили ошибку при применении этих фильтров для Realm3Element
:
class Realm3Element: Object {
let tags = List<String>()
}
Для СОДЕРЖИТ ВСЕ условие:
'Invalid value', reason: 'Expected object of type (null) for property 'tags' on object of type 'Realm3Element', but received: tag0'
Для СОДЕРЖИТ ЛЮБОЕ условие:
'Expected object of type (null) in IN clause for property 'tags' on object of type 'Realm3Element', but received: tag0'
Мы изучили все возможные варианты, но не смогли найти решение.
Поддерживает ли Realm3 фильтрацию по полю массивов примитивов?