NSPredicate 与核心数据问题

Posted

技术标签:

【中文标题】NSPredicate 与核心数据问题【英文标题】:NSPredicate with Core Data issue 【发布时间】:2016-05-25 10:03:58 【问题描述】:

我在 Core Data 数据库中有 Orders 对象。它们中的每一个都有日期和字段 flag = 0 或 1(1 表示该对象是从服务器加载的所有其他对象并且具有所有正确的字段并且不再更改,0 表示该对象可以稍后更改,我需要稍后从服务器重新加载它)。我需要使用按日期排序的 NSFetchedresultController 在 UITableView 中加载该数据,但我只需要加载此数据直到 0 (因为之后我将在表底部显示 UIActivityIndi​​cator 以从服务器加载其他数据)。例如,我有按日期排序的数据:

1 1 1 1 1 0 0 0 1 1 1 1

我只需要加载前五个对象(用粗体标记)。我不知道如何正确编写 NSPredicate。如果我写“flag > 0”,我将使用 flag = 1 加载其他对象。现在我只看到加载所有数据并使用 for 循环形成正确数组的解决方案。但是有没有更好的解决方案?

【问题讨论】:

为什么不在带有零标志(希望存储为 bool false)的行上显示带有指示器或刷新按钮的所有行? 因为在这种情况下,当用户加载信息时,他将不知道哪些行是最新的,哪些行是旧数据(可能是 1 个月大)。在没有最新信息的行上显示指示器是违反设计的。最好只显示最新的行,直到旧行。并且这是一种罕见的情况,用户将有“0”行,并会刺激用户通过一个请求加载旧行 【参考方案1】:

您可以通过两次提取来执行此操作:首先,使用谓词 flag == 0 进行提取,按日期排序,使用 fetchLimit = 1。获取该对象的date 属性的值(例如firstDate),并将其用于FRC 下的主要提取的谓词(例如"date > %@", firstDate)。如果第一次获取结果为 0,则不需要谓词 - 所有对象都必须有 flag == 1

【讨论】:

是的,如果我只是获取对象,这将起作用。但是我需要将它与 NSFetchedResultController 一起使用,所以我不知道如何实现它。或者你的意思是:首先我需要找到 flat = 0 的对象(第一个对象),然后才需要为 NSFetchedResultController 创建 NSFetchRequest? (如果是,也可以,但希望有更好的解决方案。如果没有人回答,我会将您的回答标记为正确) @PaulGalavic 是的,这就是我的意图:第一次获取,它为 FRC 的谓词提供日期。我同意这并不理想 - 希望有人会有更简洁的解决方案。【参考方案2】:

获取按日期排序的标志为 1 的前 5 个对象

使用NSPredicate作为标志过滤 将NSSortDescriptor设置为按日期排序 将fetchLimit 设置为5。

【讨论】:

我不知道带有标志 1 的对象的数量是 5。可能是 150(我需要获取所有对象,直到“0”标志)。所以它可以是 flag = 1 的 150 个对象,然后是 flag = 0 的 5 个对象,然后是 flag = 1 的 100 个对象,我只需要这 150 个对象 很公平。问题中没有明确说明这一点。我认为 pbasdf 的答案是可行的。

以上是关于NSPredicate 与核心数据问题的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:过滤多对可能与 NSPredicate 的关系

使用核心数据在 NSPredicate 中调用对象的方法

在保存到核心数据之前将字符串与 NSPredicate 进行比较

使用 NSPredicate 获取核心数据对象数组?

使用 NSPredicate 过滤核心属性和实体

采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?