核心数据关系、NSPredicates 和 NSFetchedResultsController

Posted

技术标签:

【中文标题】核心数据关系、NSPredicates 和 NSFetchedResultsController【英文标题】:Core Data Relationships, NSPredicates and the NSFetchedResultsController 【发布时间】:2010-07-04 20:07:37 【问题描述】:

这让我整天发疯。

我有一个奇怪的错误,我认为我已将其范围缩小为 NSPredicate。我有两个实体:List 和 Person。 List 与称为 Person 的 Person 具有一对多关系,而 Person 与称为 List 的 List 具有一对多关系。

我将一个 List 对象传递给我的 tableview 控制器。然后,我希望该 tableview 控制器显示属于该列表对象的 Persons。我正在使用 NSFetchedResultsController 执行此操作。

在设置 NSFRC 时,我有以下代码(为清楚起见,省略了内存管理)。有问题的列表是myList

// Create the request and set it's entity
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

// Create a predicate to get the persons that belong to this list
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList];

// Assign this predicate to the fetch request
[fetchRequest setPredicate:predicate];

// Define some descriptors
NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES];
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

// Create and initialize the fetch results controller.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;

我认为问题出在这一行(因为如果我删除它就会消失):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY lists == %@)", myList];

当父视图将myList 传递给tableview 控制器时,模拟器会挂起。控制台中没有崩溃日志或任何东西。几乎就好像只需要 AGES 来整理 NSFRC。

这是我使用的谓词有问题吗?

【问题讨论】:

【参考方案1】:

如果可以从传入tableViewController的列表中获取Persons,是否需要使用NSFetchedResultsController

NSSet *people = myList.persons;

【讨论】:

【参考方案2】:

你是对的,你可以使用myList.personsNSFetchedResultsController 在这种情况下是不必要的。

【讨论】:

您的评论令人困惑。我的回答提供了一个需要重新设计 tableViewController 的替代方案。【参考方案3】:

感谢关于使用 NSSet 的建议。经过数小时的错误跟踪,我意识到问题出在表格视图的 cellForIndexPath 方法中(因此,与 NSFRC 无关)。

【讨论】:

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

使用 JOIN 访问 NSPredicate 中的核心数据实体关系

iOS核心数据“加入”两个“表”

在 NSFetchRequest 上设置 2 个 NSPredicates

核心数据转换器

使用 NSPredicates 过滤 NSMutableArray

崩溃后核心数据为空