我的模型事件中有一个父实体。还有两个子实体:生日、周年纪念日。我正在使用核心数据中内置的实体继承功能,这样生日和周年纪念日的父对象就是 Event。
所以我使用以下方法进行提取:
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...
现在我想按事件类型、生日或周年纪念日对获取的对象进行排序。
我该怎么做?我试过:
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];
}
}
但如果有更好的方法,我愿意接受!谢谢。
最佳答案
在 Event
上有一个只读属性,称为 eventType
或类似的,它返回一个字符串。您的 Event 类返回一个字符串,您的子事件返回 Birthday、Anniversary 以及 future 事件类型的任何其他内容。
在你的抓取结果 Controller 中,如果你使用一个,你可以将 eventType 设置为你的部分名称关键路径,这将为你将类型划分为部分 - 像这样的 transient 属性可以用于此目的,但你不能将它们用作获取请求的一部分。
在上述情况下,使用事件类型作为谓词或排序描述符来处理从获取请求返回的所有事件的数组。
如果您不喜欢字符串,可以使用枚举。如果您想在获取请求中使用事件类型,请将其作为 Event 类的属性并在 awakeFromInsert 上适当设置。
关于ios - NSFetchedResultsController 和实体继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9620954/