我在尝试计算托管对象上下文中的实体时遇到了一个奇怪的问题。
- (NSUInteger)countEntity:(NSString *)entityName
inContext:(NSManagedObjectContext *)context{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
inManagedObjectContext:context];
[request setEntity:entity];
[request setIncludesSubentities:NO];
NSError *error = nil;
NSUInteger count = [context countForFetchRequest:request error:&error];
[request release];
return count;
}
该行:
NSUInteger count = [context countForFetchRequest:request error:&error];
抛出NSInternalInconsistencyException reason: 'entity not found'
更改为:
NSUInteger count = [[context executeFetchRequest:request error:&error] count];
没有任何问题。
我在这里失去了。有什么想法吗?
谢谢!
/奥斯卡
答案 0 :(得分:4)
今天遇到这个。当我介绍第二个持久存储时开始发生。你在moc有多个商店吗? -Ken
答案 1 :(得分:1)
值得一提的是,我遇到了一个类似的错误,其中executeFetchRequest:error
和countForFetchRequest:error:
不同意获取请求中的对象数量。
方案是我嵌套了NSManagedObjectContexts
,其根类型为NSPrivateQueueConcurrencyType
(用于保存到磁盘),由持久性存储和类型为NSMainQueueConcurrencyType
的子级支持(用于保存到磁盘)由gui使用)。 (是的,我正在使用MagicalRecord)
我有ViewController
在'主'上下文中听NSManagedObjectContextDidSaveNotification
。当该通知触发时,countForFetchRequest:error:
方法不包括在上下文中进行的未在父根上下文中保存的更改。但是executeFetchRequest:error
会返回预期的对象集。
有点奇怪。
答案 2 :(得分:0)
检查几件事:
error
的价值是多少?传递该对象的原因是当出现问题时从中获取信息。[request entity]
的价值是多少?我可能已经完全离开了,但我非常隐约地记得有关请求是一次性交易的事情:一旦执行它,你必须重置所有各种字段才能再次执行它。确保您的请求的所有属性在第一次调用后仍然有效,或者更好地创建第二个NSFetchRequest实例以执行第二次调用。答案 3 :(得分:0)
我怀疑entity
是nil
(即context
是nil,或者没有正确配置的持久存储协调器,其中包含您的实体的托管对象模型,或者您拼错了实体名称在对象模型或调用代码中的某处。在致电entity
后确认nil
不是+[NSEntityDescription entityForName:inManagedObjectContext:]
。
答案 4 :(得分:0)
我运行你的方法countEntity:在我自己的一个项目中,它运行良好。我可以让它抛出异常的唯一方法(“_countWithNoChangesForRequest:错误:获取请求必须有一个实体。”)当我错误地将实体的名称(小部件而不是Widgets)大写时。所以,你可能想调查那个方向。
答案 5 :(得分:-1)
您遇到的问题是由于countForFetchRequest的错误使用:错误:实际上,在您的代码片段中,您首先使用executeFetchRequest:error执行获取请求,然后继续使用countForFetchRequest:error:。
从方法文档:
返回给定获取请求传递给executeFetchRequest时返回的对象数:error:。
因此,在调用countForFetchRequest之前,您不能执行获取请求:error:。