假设我有一个实体Fragment
,它有一个属性“文本”,它是一个字符串,我想查询长度为 5Fragment
的列表:text
[NSPredicate predicateWithFormat:@"position == %@ AND text.length == %d", pos, 5];
它不起作用(即不返回结果),但是如果我在查询中删除 text.length 它会起作用,并且我确定有长度为 5 的文本,那么我需要将其更改为什么?
谢谢!
假设我有一个实体Fragment
,它有一个属性“文本”,它是一个字符串,我想查询长度为 5Fragment
的列表:text
[NSPredicate predicateWithFormat:@"position == %@ AND text.length == %d", pos, 5];
它不起作用(即不返回结果),但是如果我在查询中删除 text.length 它会起作用,并且我确定有长度为 5 的文本,那么我需要将其更改为什么?
谢谢!
中的字符串没有长度属性NSPredicate
。改用正则表达式。您的谓词应如下所示:
[NSPredicate predicateWithFormat:@"position == %@ AND text MATCHES %@", pos, @".{5}"];
您不能像length
在 Core Data 获取请求中那样使用 Objective-C 函数。但是您可以将其替换为“LIKE”运算符,该运算符进行简单的模式匹配:
[NSPredicate predicateWithFormat:@"text LIKE %@", @"?????"];
有趣的一点是,Core Data 不会抛出异常或返回错误,而只是忽略length
方法,即它只是使用谓词"text = '5'
。这可以通过设置启动参数激活 Core Data 调试输出来看到
-com.apple.CoreData.SQLDebug 3
(这通常是定位 Core Data 获取问题的好方法)。
我认为它将 text.lengh 视为一种关系。尝试仅使用位置设置谓词,然后循环查找 text.length == 5。