【问题标题】:Using NSFetchRequest with complex NSPredicate in a NSFetchRequestController在 NSFetchRequestController 中使用带有复杂 NSPredicate 的 NSFetchRequest
【发布时间】:2014-05-07 23:01:26
【问题描述】:

我正在尝试实现一些我确信之前已经实现过一百万次的东西,在核心数据数据库中进行搜索,使用fetchRequestControllersearchController 显示在表格中。

我的问题是为NSFetchRequest 编写NSPredicate。根据 Apple 的 NSPredicate 指南,并非您在 Sqlite 中可以做的所有事情都可以通过核心数据实现。 一段时间以来,我一直在努力寻找解决方案,但也许你们中的一个人可以利用他的经验来帮助我。

CoreData 数据库说明: ShopsDiscountProgam 具有多对多关系。

我的用例如下:我需要过滤掉Shops who's name/address/zip/city 包含搜索字符串。这是容易的部分。 困难的部分是创建我要从中过滤的数据库部分,因为我有一组“活动”discountPrograms UID,我只希望shops 在其“折扣程序”中有一个活动折扣计划放。所以在伪代码中:

FROM Shops 至少有一个 discountProgram 的 uid IN activeDiscountProgramsArray WHERE name/address/zip/city CONTAINS searchString

这可能吗?我是否超出了谓词的限制? 如果是这样,我该怎么做?

【问题讨论】:

  • UID 是DiscountProgam 的属性,还是被管理对象的id?您目前正在尝试什么谓词?
  • @Wain UID 是 DiscountProgram 的属性。我目前没有使用谓词,而是使用 for-in 循环在内存中执行所有操作。

标签: ios sqlite core-data nspredicate nsfetchrequest


【解决方案1】:

是的,NSPredicate 可以分析 fetch 的目标实体的直接属性及其关系的属性。试试:

NSArray *validUIDs = ...;
NSString *searchTerm = ...;

[NSPredicate predicateWithFormat:@"(name CONTAINS[cd] %@ OR zip CONTAINS[cd] %@) AND (SUBQUERY(discountProgram, $d, $d.UID IN %@).@count > 0)", searchTerm, searchTerm, validUIDs];

【讨论】:

  • 谢谢,我会试试看的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多