如何在 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 中使用 NSPredicate
的 MATCH
关键字。如何重现此查询以便它在 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 过滤 Core Data 托管对象?