0

我正在UITableView使用NSFetchedResultsController. 数据来自NSManagedObjectMogenerator 生成的名为 MenuItem 的子类。MenuItem 实体有一个 SectionID 参数,它NSNumber是用于确定项目应位于表视图中的哪个部分。

我对数据进行了测试,并确认 Core Data 已正确填充。一切都很好。

NSFetchedResultsController创建如下并将sectionKeyNamePath设置为@"sectionId" :

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MenuItem" inManagedObjectContext:self.persistenceController.moc];
[fetchRequest setEntity:entity];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"sectionId" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"rowId" ascending:YES]];    
NSFetchedResultsController *frc = nil;
frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                          managedObjectContext:self.persistenceController.moc
                                            sectionNameKeyPath:@"sectionId"
                                                     cacheName:nil];

问题(和解决方案):

使用此代码,不会识别这些部分。总是返回 0。这NSFetchedResultsController在我之前手动创建 NSMO 子类时有效,所以我认为它与 Mogenerator 有关。

如果我将 sectionNameKeyPath 更改为 @"primitiveSectionId" 那么它可以工作。

希望这对将来的某人有所帮助,但我不明白这里发生了什么。请有人解释为什么这可以解决问题?

谢谢

4

1 回答 1

0

为什么将 FRC 设置为零?试试这个(它适用于我使用 NSNumber 属性):

例如,使用 mogenerator,您可以使用“[MenuItem entityName]”获取实体并使用 MenuItemAttributes.sectionId 访问属性。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[MenuItem entityName]];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:MenuItemAttributes.sectionId ascending:YES], [NSSortDescriptor sortDescriptorWithKey:MenuItemAttributes.rowID ascending:YES]];
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                      managedObjectContext:self.persistenceController.moc
                                                                        sectionNameKeyPath:MenuItemAttributes.sectionId
                                                                                 cacheName:nil];

// Make sure you set your frc as the delegate
frc.delegate = self;

NSError *error = nil;
if (![fetcher performFetch:&error]) {
    /*
     * Did you execute the request?
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
NSLog(@"%lu", [frc.sections count]);
于 2015-10-05T02:46:44.687 回答