swift - NSPredicate 用于过滤 Realm 3 中的原始字段数组

标签 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. CONTAINS ALL OF 条件如下所示:

任何 tags.value == "tag0"和任何 tags.value == "tag1"和任何 tags.value == "tag2"

  1. CONTAINS ANY OF 条件如下所示:

任何 tags.value IN {"tag0", "tag1", "tag2"}

Realm3 支持基元数组。我们从条件中删除了 .value keyPath。但是当为 Realm3Element 应用这些过滤器时我们遇到了错误:

class Realm3Element: Object {
    let tags = List<String>()
}

对于CONTAINS ALL OF条件:

'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 是否支持按原语字段数组过滤?

最佳答案

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

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

如果你想要一个完美的解决方案跟踪这个问题#5334

关于swift - NSPredicate 用于过滤 Realm 3 中的原始字段数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198033/

相关文章:

swift - 实例化 Realm 模型类因缺少 key 错误而崩溃

ios - NSPredicate 使用数组作为过滤器

iphone - countForFetchRequest 和executeFetchRequest 返回不同数量的结果

Swift:使用弱 self 在基于 block 的执行中保持原子性

arrays - 如何将字符串数组转换为列表

ios - 清除完整的 Realm 数据库

ios - NSPredicate 用于过滤带有 ( ' ) 字符问题的数组

swift - 从另一个 Swift 类访问 navigationItem.title

swift - 有没有办法避免使用 Xcode 8 将 Swift 从 2.2 转换为 2.3 或 3?

ios - 当用户添加新联系人时更新应用程序核心数据/Realm