NSPredicate для фильтрации массива полей примитивов в Realm 3 - PullRequest
0 голосов
/ 06 мая 2018

Мы должны хранить элементы в 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>()
}

В результате:

  1. СОДЕРЖИТ ВСЕ ОТ условие выглядит так:

ANY tags.value == "tag0" AND ANY tags.value == "tag1" AND ANY tags.value == "tag2"

  1. СОДЕРЖИТ ЛЮБОЕ из условие выглядит так:

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 фильтрацию по полю массивов примитивов?

1 Ответ

0 голосов
/ 06 мая 2018

Вы не можете достичь своих целей, используя predicate с Realm, потому что Realm имеет множество ограничений, используя Predicates, но вы можете использовать этот способ в качестве обходного пути

  let filterArray = ["tag0","tag1"]
    Array(realm.objects(Realm3Element.self)).filter({$0.tags.sorted().joined().contains(filterArray.sorted().joined())})

Если вы хотите идеальное решение для отслеживания этой проблемы # 5334

...