Core Data NSPredicate 过滤结果

Posted

技术标签:

【中文标题】Core Data NSPredicate 过滤结果【英文标题】:Core Data NSPredicate to filter results 【发布时间】:2010-03-16 16:23:16 【问题描述】:

我有一个包含 bID 和 pID 的 NSManagedObject。在 NSManagedObjects 集合中,我只希望返回一个子集,并且我正在努力寻找正确的 NSPredicate 或从 Core Data 中获取所需内容的方法。

这是我的完整列表:

出价 pid 41 0 42 41 43 0 44 0 47 41 48 0 49 0 50 43

上面有父子关系。

规则:

如果记录的 PID = 0,则表示该记录是父记录。 如果记录的 PID != 0,则该记录的 PID 指的是它的父记录的 BID。

例子:

1) BID = 41 是父记录。为什么?因为记录 BID=42 和记录 BID=47 的 PID 为 41,这意味着它们是其 PID 记录的子记录。 2) BID = 42 有一个 BID = 41 的父记录。 3) BID = 43 是父记录。 4) BID = 44 是父记录。 5) BID = 47 有一个 BID = 41 的父记录,因为它的 PID = 41。参见上面的 #1。 6) BID = 48 是父记录。 7) BID = 49 是父记录。 8) BID = 50 为子记录,其父记录的 BID = 43。

看到模式了吗?

现在,基本上,我只想要获取以下行:

出价 pid 44 0 47 41 48 0 49 0 50 43

BID = 41、BID = 48、BID = 49 都应返回,因为没有 PID 等于其 BID 的记录。

应该返回 BID = 47,因为它是 PID = 41 的最新子代。 应该返回 BID = 50,因为它是 PID = 43 的最新子代。

希望这有助于更多地解释它。

【问题讨论】:

哎呀,即使您修改了问题,也不清楚您想从数据中得到什么。尝试定义一个规则来获取您的数据,您将看到如何去做。根据您的解释,我没有看到任何规则来获取您想要的数据。你说你想得到bid=44,但后来你说41? 【参考方案1】:

哦,这很简单,你只需要设置谓词bid >= 43。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bid >= %@", [NSNumber numberWithInt:43]];

我猜你的 NSNumber 可能有问题,因为 Core Data 在 NSNumber 下保存了许多类型,包括:int、BOOL 等...See here

【讨论】:

好的,在我给你的数据集中,恰好是这种情况。但这不适用于更大的数据集。是亲子关系。 PID 是指另一个 BID。所以 41 的 BID 有 2 个孩子,BID=42 和 BID=47。在这种关系中,我只希望返回 BID=47。如果 PID 为 0,则也将其添加到子集中,只要没有 PID = BID 的行。 我认为你应该多花点时间,通过清楚地编辑问题来准确描述你想要做什么,如果可能的话,给我们一些规则,否则答案将毫无用处。 您可能还想在某处发布您的数据模型。

以上是关于Core Data NSPredicate 过滤结果的主要内容,如果未能解决你的问题,请参考以下文章

iPhone如何使用NSPredicate按父实体过滤Core Data?

Core Data NSPredicate 按数组中的项目过滤项目集

SwiftUI Core Data - NSPredicate 动态过滤字符串数组属性包含给定字符串的位置

如何过滤从 Core Data 获取的数据?

如何过滤在 Core Data 中有对象的表视图?

使用 NSPredicate 从 Core Data 访问对象