如何在 NSPredicate 中重现 MATCHES 以查询 Realm?

Posted

技术标签:

【中文标题】如何在 NSPredicate 中重现 MATCHES 以查询 Realm?【英文标题】:How to reproduce MATCHES in NSPredicate to query Realm? 【发布时间】:2015-05-29 14:40:21 【问题描述】:

我有一个使用 NSPredicate 的查询,它采用正则表达式并匹配路径:

let predicate = NSPredicate(format: "path MATCHES '/test/([^/]*[^/])$'")

匹配文件夹 test 中的所有内容,但排除 test 中文件夹的所有子文件夹,如下所示:

    /test/abc -> 是的 /test/abc/def ->

问题是,我不能在 Realm.io 中使用 NSPredicateMATCH 关键字。如何重现此查询以便它在 Realm 中工作?

为完整性添加例外:

*** Terminating app due to uncaught exception 'Invalid operator type', reason: 'Operator type 6 not supported for string type'

【问题讨论】:

【参考方案1】:

所以现在我已经解决了这样的问题(修改模型,我想避免):

    我只存储到父级的路径,而不是完整的路径和名称。名称存储在不同的字段中(为了获得完整路径,我将两个字符串拼接在一起) 我没有匹配正则表达式,而是使用NSPredicate(format: "path ==[c] %@", "/test/") 来获取文件夹test的内容。

为什么我对这个解决方案并不完全满意:

我想避免将字段 fullPath 分成两个字段,因为当文件被重命名 + 移动时,它只是一个操作 - 重写数据库中的 fullPath。这似乎是一个小问题,但只有一个责任位置使它更加健壮,因为文件一直在应用程序的环境中移动和重命名。

【讨论】:

【参考方案2】:

来自 Realm 的 Joe。目前,MATCH 的 Realm 查询不支持正则表达式,您需要手动执行此操作。我会构建一个 NSArray 并在其上使用过滤谓词。我们知道这一点并跟踪所有不受支持的谓词here

【讨论】:

嗨,乔,感谢您的宝贵时间。但是,我能够在github.com/realm/realm-cocoa/blob/master/Realm/RLMQueryUtil.mm 685-706 行中获得此信息。我希望您知道一些解决方法。 通过更改模型解决了问题。建议的NSArray 过滤是不可接受的 - 如果有大量子文件夹和文件,我在列出根文件夹的内容时实际上是在整个结构中循环两次。密切关注 #1490 :-) 很高兴听到您找到了更好的替代解决方案!感谢您耐心等待,我们将继续为查询添加更多支持

以上是关于如何在 NSPredicate 中重现 MATCHES 以查询 Realm?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSPredicate 中定义临时变量?

如何使用 NSPredicate 在字符串中查找开头的单词?

如何通过 NSPredicate 过滤 Core Data 托管对象?

在目标 c 中使用 nspredicate 时如何解决空间问题?

如何使用 NSPredicate 从数组中选择确切的短语?

如何使用目标 C 将 JSON 响应存储到 NSPredicate 中?