NSFetchedResultsController 和实体继承

Posted

技术标签:

【中文标题】NSFetchedResultsController 和实体继承【英文标题】:NSFetchedResultsController and Entity Inheritance 【发布时间】:2012-03-08 16:16:09 【问题描述】:

我的模型事件中有一个父实体。还有两个子实体:生日、周年纪念日。我正在使用核心数据中内置的实体继承功能,例如生日和周年纪念的父对象是事件。

所以我使用以下方法进行提取:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start_date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

etc...

现在我想按事件类型、生日或周年纪念对 fetchedObjects 进行排序。

我该怎么做?我试过了:

for (Birthday *birthday in _fetchedResultsController.fetchedObjects)
    [birthdayObjects addObject:birthday]; 

for (Anniversary *anniversary in _fetchedResultsController.fetchedObjects)
    [anniversaryObjects addObject:anniversary]; 

但这只是将 fetchedObjects 中的所有对象添加到每个数组中。

有什么想法吗?或者我是不是走错了路?

更新

用这个解决了:

for (Event *event in _fetchedResultsController.fetchedObjects)
    if ([event isKindOfClass:[Birthday class]])
        [birthdayObjects addObject:event]; 
    else
        [anniversary addObject:event];
    

但如果有更好的方法我愿意接受!谢谢。

【问题讨论】:

为@"class"添加另一个排序描述符..这可能会起作用 [obj valueForKey:@"class"] 确实给了我正确的类名。嗯....我没有一个项目可以立即满足您的条件。 我会使用isKindOfClass: 方法;将其发布为您自己问题的答案,以供将来参考。 【参考方案1】:

Event 上有一个名为eventType 或类似名称的只读属性,它返回一个字符串。您的事件类返回一个字符串,而您的子事件返回生日、周年纪念日,以及未来事件类型的任何其他内容。

在您获取的结果控制器中,如果您使用一个,您可以将 eventType 设置为您的部分名称键路径,这将为您将类型划分为部分 - 像这样的瞬态属性可以用于此目的,但您不能将它们用作获取请求的一部分。

在上述情况下,使用事件类型作为谓词或排序描述符来处理从获取请求返回的所有事件的数组。

如果你不喜欢字符串,你可以使用枚举。如果要在获取请求中使用事件类型,请将其设置为 Event 类的属性并在 awakeFromInsert 上适当地设置它。

【讨论】:

这不是表现不佳吗?我在提供排序或部分描述符时了解到,最好使用存储的属性。但我不确定在这种情况下该怎么做。

以上是关于NSFetchedResultsController 和实体继承的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?