【问题标题】:Core data don't return full objects, data: <fault>核心数据不返回完整对象,数据:<故障>
【发布时间】:2017-02-16 17:59:35
【问题描述】:

我正在尝试获取两个实体,例如:emailattribute 的学生和教授,它们都有相同的父实体,例如:attributesentityId, firstName and lastName 的人我想使用 @ 在两个部分中生成它们987654328@。 这是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,另一个用于Professor

我得到了两个部分,但学生在不同的部分,我已经在控制台中打印了来自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] 强制获取请求返回完整对象,但没有效果。

为什么会这样?

【问题讨论】:

  • 如果您尝试获取这些对象的属性之一的值,而不是仅仅打印该对象,会发生什么?
  • 在您实际尝试使用获取的实体的任何字段之前,核心数据不会加载所有数据是正常的。
  • 如果我在代码中打印它们 NSLog(@"%@", profesor.firstName);它打印
  • 请参阅this answer 了解故障说明。要将学生与教授分开,您需要添加 entityId 作为另一个(第一个)排序描述符。
  • 完全正确 - 您需要按 entityId 进行排序,以确保学生与教授分开。当前,您的排序描述符指定 firstName 和 lastName。因此,Charlie Dean 教授将在学生 Alex Brown 之后,但在学生 Eli Frost 之前。因此混合。

标签: ios objective-c iphone core-data


【解决方案1】:

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

request.returnsObjectsAsFaults = NO;

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2010-12-22
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多