核心数据关系,NSPredicates和NSFetchedResultsController

时间:2010-07-04 20:07:38

标签: iphone objective-c cocoa uitableview nsfetchedresultscontroller

这一直让我疯狂。

我有一个奇怪的错误,我认为我已经缩小到NSPredicate。我有两个实体:List和Person。 List与Person有一个to-many关系,称为person,Person与List被叫列表有很多关系。

我将一个List对象传递给我的tableview控制器。然后我希望tableview控制器显示属于该列表对象的人员。我是用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。

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

3 个答案:

答案 0 :(得分:1)

当您从传递到tableViewController的列表中获取NSFetchedResultsController时,是否需要使用Person

NSSet *people = myList.persons;

答案 1 :(得分:1)

你是对的,你可以使用myList.persons,在这种情况下不需要NSFetchedResultsController

答案 2 :(得分:0)

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