8

假设我有一个实体Fragment,它有一个属性“文本”,它是一个字符串,我想查询长度为 5Fragment的列表:text

[NSPredicate predicateWithFormat:@"position == %@ AND text.length == %d", pos, 5];

它不起作用(即不返回结果),但是如果我在查询中删除 text.length 它会起作用,并且我确定有长度为 5 的文本,那么我需要将其更改为什么?

谢谢!

4

3 回答 3

17

中的字符串没有长度属性NSPredicate。改用正则表达式。您的谓词应如下所示:

[NSPredicate predicateWithFormat:@"position == %@ AND text MATCHES %@", pos, @".{5}"];
于 2013-11-10T11:52:17.287 回答
1

您不能像length在 Core Data 获取请求中那样使用 Objective-C 函数。但是您可以将其替换为“LIKE”运算符,该运算符进行简单的模式匹配:

[NSPredicate predicateWithFormat:@"text LIKE %@", @"?????"];

有趣的一点是,Core Data 不会抛出异常或返回错误,而只是忽略length方法,即它只是使用谓词"text = '5'。这可以通过设置启动参数激活 Core Data 调试输出来看到

-com.apple.CoreData.SQLDebug 3

(这通常是定位 Core Data 获取问题的好方法)。

于 2013-11-10T11:52:16.003 回答
0

我认为它将 text.lengh 视为一种关系。尝试仅使用位置设置谓词,然后循环查找 text.length == 5。

于 2013-11-10T11:46:37.843 回答