核心数据不返回完整对象,数据:<fault>

时间:2016-10-07 16:46:41

标签: ios objective-c iphone core-data

我正在尝试获取两个实体,例如:具有email attribute的学生和教授,两者都具有相同的父实体,例如:attributes entityId, firstName and lastName我需要的人使用NSFetchedResultsController在两个部分中生成它们。 以下是来自fetchedResultsController

的getter的一部分
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

[fetchRequest setFetchBatchSize:20];
[fetchRequest setReturnsObjectsAsFaults:NO];

NSEntityDescription *description = [NSEntityDescription entityForName:@"Person"
                                               inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:description];

NSSortDescriptor *firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
[fetchRequest setSortDescriptors:@[firstNameDescriptor, lastNameDescriptor]];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
                                                         initWithFetchRequest:fetchRequest
                                                         managedObjectContext:self.managedObjectContext
                                                           sectionNameKeyPath:@"entityId"
                                                                    cacheName:nil];

所有Students都具有相同的entityId和所有Professors

在tableView中,我有两个原型单元格,一个用于Student,另一个用于ProfessorIt looks smth like this

我按预期得到两个部分,但是学生在不同的部分,我在控制台中打印了来自fetchedResultsController的所有对象,po [self.fetchedResultsController objectAtIndexPath: [NSIndexPath indexPathForItem:1 inSection:1]]所有教授都打印有fault

<Professor: 0x6080000befc0> (entity: Professor; id: 0xd0000000001c0002 <x-coredata://03A3ECAD-CCA7-424E-86F9-258D25372BA1/Professor/p7> ; data: <fault>)

我强制获取请求使用[request setReturnsObjectsAsFaults:NO]返回完整对象,但它没有效果。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

要避免“数据错误”问题,您应该设置NSFetchRequest的此字段:

request.returnsObjectsAsFaults = NO;

要将学生与教授分成两部分,您可以使用多个NSFetchedResultsControllers,如下所述: https://stackoverflow.com/a/2309855/1689376

为避免重复代码,只需创建一个这样的方法并调用它两次:

- (NSFetchedResultsController) createFetchedResultsController: (NSString *)  entityName {
 //move your code here
}