如何在Objective C中使用NSPredicate指定范围

4

我希望通过指定范围来查询sqllite表。就像是给我所有id列在3000和3010之间的记录。

我尝试了苹果推荐的方法,但并没有成功。以下是我尝试但失败的内容。

NSPredicate *betweenPredicate =
[NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];

我有两个字符串,一个称为“start”,另一个称为“end”。我按照以下方式更新了苹果的示例。
NSPredicate *betweenPredicate =
[NSPredicate predicateWithFormat: @"%@ BETWEEN %@", columnName, @[start,end]];

当我使用上述谓词执行executeFetchRequest时,尽管表中有与该谓词匹配的记录,但我却得到了0条记录。有人能指出我的错误所在吗?
1个回答

9

您需要使用%K格式说明符来表示属性名称:

[NSPredicate predicateWithFormat: @"%K BETWEEN %@", columnName, @[start,end]];

如果那样不起作用(我从未在Core Data获取请求中使用“BETWEEN”),您可以将其替换为等效的谓词。
[NSPredicate predicateWithFormat: @"%K >= %@ AND %K <= %@",
         columnName, start, columnName, end];

当我使用%K而不是%@时,我会得到[__NSCFString constantValue]:向实例发送未识别的选择器错误。你给出的第二个例子有效。谢谢。 - neo
@neo:不用谢!(我依稀记得“BETWEEN”在Core Data中无法使用,但我不确定。) - Martin R
BETWEEN 在 Core Data 中的使用非常完美:%K BETWEEN { %f , %f },并且比 %K <= %f && %K >= %f 快约 10 倍。这里是苹果开发者文档中关于谓词格式的链接:Predicate Formatting guide - Neimsz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接