使用 nil 值获取和排序核心数据

Posted

技术标签:

【中文标题】使用 nil 值获取和排序核心数据【英文标题】:core data fetching and sorting with nil value 【发布时间】:2013-11-02 10:41:07 【问题描述】:

我在使用 Core Data 时遇到了问题。

在我的核心数据模型中,我有Grove Entity 和Tree Entity,GroveTree 之间存在一对多关系,TreeGrove 之间存在一对一关系 (每棵树最多可以在一个树林中)。

但有些Tree 可能是“狂野的”,而不是任何Grove 的一部分。

我正在尝试使用 fetResultController 在表格视图中显示我的所有树。 每个 Grove 都是 table view 的一个部分,而“野生”树必须在一个单独的部分中。

我的代码是这样的:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tree" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sectionSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Grove.name" ascending:YES];
    NSSortDescriptor *rowSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES];
    NSArray *sortDescriptors = @[sectionSortDescriptor, rowSortDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"Grove.name" cacheName:nil];

如您所见,我正在获取所有树。 用于确定部分的第一个排序描述符基于从树到树的一对一关系,并查找树的名称。 第二个排序描述符用于对给定部分内的树进行排序,并按类型对它们进行排序。

当树木定义了树林时,此代码绝对可以正常工作。 但是这个请求没有获取 grove=nil 的树。 你知道实现想要的行为的方法吗? 我必须为野树造一个假树林吗?

【问题讨论】:

【参考方案1】:

我建议按照您的建议创建一个表示“无”的特殊 Grove 实例。

另一个解决方案是获取 groves 并按如下方式操作表视图数据源方法:

返回结果数 +1 作为节数。例如。野生树木的最后一部分。 根据返回的grove实体配置section header。 返回 theGrove.trees.count 作为节中的行数,对最后一节的其他树进行特殊提取。 等等..

你明白了要点。使用 fetched results 控制器有点复杂,而且非标准使用,但我之前发现它工作得很好。

【讨论】:

我选择了“NONE” Grove 的简单解决方案

以上是关于使用 nil 值获取和排序核心数据的主要内容,如果未能解决你的问题,请参考以下文章

nsfetchedresultscontroller 中部分名称键路径的 Nil 关系值

核心数据 - NSManagedObject 返回 nil

多线程核心数据有时会返回 nil 属性

使用 NSSortDescriptor 将“nil”值保留在列表底部

如何根据来自多个 Core Data 属性的计算值进行排序

核心数据,NSPredicate,任何 key.path == nil