NSPredicate用于过滤领域3中的基元数组字段

时间:2018-05-06 09:06:32

标签: swift realm nspredicate

我们必须在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. 包含所有条件如下所示:
  2. ANY tags.value == "tag0" AND ANY tags.value == "tag1" AND ANY tags.value == "tag2"

    1. 包含任何条件如下所示:
    2. 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 :(得分:0)

使用Realm predicate无法实现目标,因为Realm使用Predicates有很多限制,但您可以使用这种方式作为解决方法

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

如果您想要一个完美的解决方案来跟踪此问题#5334