【问题标题】:How to specify range with NSPredicate in Objective C如何在 Objective C 中使用 NSPredicate 指定范围
【发布时间】:2013-08-03 22:06:41
【问题描述】:

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

我尝试了 Apple 推荐的方法,但没有奏效。这是我尝试过但失败的方法。

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

我有 2 个字符串,分别称为 start 和 end。我将 Apple 的示例更新如下。

NSPredicate *betweenPredicate =
[NSPredicate predicateWithFormat: @"%@ BETWEEN %@", columnName, @[start,end]];

当我使用上述谓词执行 FetchRequest 时,即使表中有与谓词匹配的记录,我也会得到 0 条记录。有人能指出我哪里出错了吗?

【问题讨论】:

    标签: ios objective-c sqlite nspredicate


    【解决方案1】:

    您必须对属性名称使用%K 格式说明符:

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

    如果这不起作用(我从未对 Core Data 获取请求使用“BETWEEN”),你 可以用等价的谓词代替它

    [NSPredicate predicateWithFormat: @"%K >= %@ AND %K <= %@",
             columnName, start, columnName, end];
    

    【讨论】:

    • 当我使用 %K 而不是 %@ 时,我得到 [__NSCFString constantValue]: unrecognized selector sent to instance 错误。你给出的第二个例子有效。谢谢
    • @neo:不客气! - (我依稀记得“BETWEEN”不适用于Core Data,但我不确定。)
    • BETWEEN 与 Core Data 完美配合:%K BETWEEN { %f , %f },比 %K &lt;= %f &amp;&amp; %K &gt;= %f 快大约 10 倍。这是苹果开发者Predicate Formatting guide的链接
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2019-11-18
    相关资源
    最近更新 更多