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

时间:2015-05-29 14:40:22

标签: regex nspredicate realm

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

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

匹配文件夹测试内的所有内容,但不包括测试中所有文件夹的子文件夹,如下所示:

  1. / test / abc - >
  2. / test / abc / def - > 没有
  3. 问题是,我无法在 Realm.io 中使用MATCH NSPredicate关键字。如何重现此查询以便它在Realm中工作?

    为完整性添加例外:

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

2 个答案:

答案 0 :(得分:1)

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

  1. 我只存储父节点的路径,而不是完整的路径和名称。名称存储在不同的字段中(为了得到完整的路径,我将两个字符串拼接在一起)
  2. 我使用NSPredicate(format: "path ==[c] %@", "/test/")代替正则表达式来获取文件夹 test 的内容。
  3. 为什么我对这个解决方案并不完全满意:

    我想避免将字段 fullPath 分成两个字段,因为当文件重命名+移动时,它只有一个操作 - 重写 fullPath 数据库。这可能看起来像是一个小问题,但只有一个责任位给它更强大,因为文件在应用程序的环境中一直被移动和重命名。

答案 1 :(得分:0)

来自Realm的乔在这里。目前使用MATCH的Realm查询不支持regex,您需要手动执行此操作。我会构建一个NSArray并使用过滤谓词。我们了解这一点并跟踪所有不受支持的谓词here