首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFetchRequest和predicateWithBlock

NSFetchRequest和predicateWithBlock
EN

Stack Overflow用户
提问于 2010-08-23 04:22:27
回答 2查看 10.4K关注 0票数 26

我正在玩一个使用核心数据和NSManagedObjects来填充UITableView的应用程序。我的应用程序中只有一个类,名为Event。我在Event上创建了以下自定义实例方法

代码语言:javascript
复制
- (BOOL)isExpired {
    return ([[self.endOn dateAtEndOfDay] timeIntervalSinceNow] < 0);
}

我想将显示Event对象的UITableView限制为只显示过期的事件-即isExpired返回YES。我曾尝试通过向NSFetchRequest添加一个NSPredicate来实现这一点

代码语言:javascript
复制
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary * bindings) {return([evaluatedObject isExpired]);}];
[fetchRequest setPredicate:predicate];

但我得到的错误是:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Problem with subpredicate BLOCKPREDICATE(0x272ac)' ***。这是否意味着您不能将块谓词与NSFetchRequest一起使用?或者我只是不恰当地构建了它?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-08-23 15:18:38

因此,似乎我们已经在对原始帖子的评论中确定,这可能是由于SQLite存储与块谓词不兼容造成的,因为核心数据无法将这些转换为SQL语句以在存储中运行它们(感谢JoostK)。

可能有几种方法可以克服这个问题:

  • 如果您的实体的终止日期是常规属性,则您可以将到期约束表示为谓词格式字符串,而不是块谓词,核心数据应该能够将其转换为SQL子句。
  • 如果上述情况可行,您可能会更喜欢使用fetch request template来检索过期项。不过,您需要传入一个替代变量,如$NOW,以提供对当前日期的访问。这具有使谓词模板显示在模型编辑器中的优点。然而,
  • 这两种方法都有复制现有功能(即,您的isExpired方法)的缺点。因此,另一种方法是首先获取所有符合条件的实体,而不考虑它们的过期状态,然后在结果实体集上运行专用的过滤步骤,以剔除未过期的实体。因为到那时,它们已经从存储中完全复活了,所以您应该能够为此使用块谓词。
票数 24
EN

Stack Overflow用户

发布于 2011-06-15 19:37:49

您可以在不指定谓词的情况下执行普通的fetch请求,然后过滤结果数组:

代码语言:javascript
复制
NSArray *allEvents = [context executeFetchRequest:fetchRequest];

if (!allEvents) { // do error handling here
}

NSArray *expiredEvents = [allEvents filteredArrayUsingPredicate:predicate];
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3543208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档