NSFetchedResultsController 总是返回 NSManagedObject 对象而不是自定义

Posted

技术标签:

【中文标题】NSFetchedResultsController 总是返回 NSManagedObject 对象而不是自定义【英文标题】:NSFetchedResultsController always returns NSManagedObject objects instead of custom 【发布时间】:2010-09-20 14:36:51 【问题描述】:

我正在使用 CoreData 并定义了一个实体 ContactList,它是我使用 XCode xcdatamodel 工具(或任何你称之为内置的东西:)创建的。我还将实体的类名称设置为“ContactList”。然后我使用rentzsch 的mogenerator (http://github.com/rentzsch/mogenerator) 生成我的自定义类文件,并将简单方法“toString”添加到我的ContactList 类中。

fetchedResultsController 回调非常标准,如下所示:

- (NSFetchedResultsController *)fetchedResultsController 

if (fetchedResultsController_ != nil) 
    return fetchedResultsController_;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ContactList" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];

NSError *error = nil;
if (![fetchedResultsController_ performFetch:&error]) 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();


return fetchedResultsController_;
    

现在,当我启动我的应用程序并尝试在“ContactList”对象上调用该方法时,我又从 NSFetchedResultsController 获得了该方法,我得到了

ContactList *contactList = (ContactList *) [self.fetchedResultsController objectAtIndexPath:indexPath];
[contactList toString];    
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject toString]: unrecognized selector sent to instance 0x6af7bf0'

正如消息所示,不知何故 NSFetchedResultsController 不返回“ContactList”对象,而是返回更通用的 NSManagedObject。

有人知道为什么以及如何解决这个问题吗???

【问题讨论】:

您的 fetchedResultsController 的实现是什么样的?如果获取请求是错误的(例如错误的 NSEntityDescription、错误的谓词语法等),您最终可能不会得到正确类型的托管对象。另外,如果你只是简单地 NSLog() 接触列表对象而不是调用 toString 会发生什么? 嘿梯队,我添加了我的 fetchedResultsController 实现,但它几乎是标准的。 NSLog(@"%@", contactList) 给我: (entity: ContactList; id: 0x6a04180 ; 数据: ) 【参考方案1】:

我遇到了同样的问题 - 因为我之前重命名了实体的托管对象子类。在 Data Modeler 中,确保在 Inspector 中为实体设置了正确的“名称”和“类”。

【讨论】:

【参考方案2】:

好的,我想通了。

问题在于 mogenerator 脚本没有将其生成的源文件添加到项目的编译目标中。这样,类就永远不会被编译和包含(我想知道没有任何模型对象类它是如何工作的:)

将 .xcdatamodel 文件添加到目标后(右键单击 .xcdatamodel 文件 -> 目标 -> 检查您的项目)现在一切正常。

欲了解更多信息,请转到here

【讨论】:

以上是关于NSFetchedResultsController 总是返回 NSManagedObject 对象而不是自定义的主要内容,如果未能解决你的问题,请参考以下文章

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