核心数据谓词:字符串属性长度?

时间:2013-11-10 11:34:17

标签: ios objective-c core-data nspredicate

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:17)

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

[NSPredicate predicateWithFormat:@"position == %@ AND text MATCHES %@", pos, @".{5}"];

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您无法在核心数据提取请求中使用length之类的Objective-C函数。但是你 可以替换为" LIKE"运算符,它执行简单的模式匹配:

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

一个有趣的观点是,Core Data不会抛出异常或返回错误, 但只是忽略了length方法,即它只是使用谓词"text = '5'。 通过设置启动参数

激活Core Data调试输出可以看出这一点
-com.apple.CoreData.SQLDebug 3

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