NSFetchedResultsController和实体继承

时间:2012-03-08 16:16:09

标签: ios core-data nsfetchedresultscontroller

我的模型事件中有一个父实体。还有两个子实体:生日,周年纪念日。我正在使用Core数据中内置的实体继承功能,以便生日和周年纪念的父对象是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...

现在我想按事件类型,生日或周年纪念对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];
    }
}

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

1 个答案:

答案 0 :(得分:0)

Event上有一个名为eventType或类似的只读属性,它返回一个字符串。您的Event类返回一个字符串,您的子事件将返回Birthday,Anniversary,以及其他任何事件类型。

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

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

如果您不喜欢字符串,可以使用枚举。如果要在获取请求中使用事件类型,请将其设置为Event类的属性,并在awakeFromInsert上进行相应设置。