CoreData countForFetchRequest表示'找不到实体'

时间:2009-10-23 04:15:13

标签: iphone objective-c core-data

我在尝试计算托管对象上下文中的实体时遇到了一个奇怪的问题。

- (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];

没有任何问题。

我在这里失去了。有什么想法吗?

谢谢!

/奥斯卡

6 个答案:

答案 0 :(得分:4)

今天遇到这个。当我介绍第二个持久存储时开始发生。你在moc有多个商店吗? -Ken

答案 1 :(得分:1)

值得一提的是,我遇到了一个类似的错误,其中executeFetchRequest:errorcountForFetchRequest:error:不同意获取请求中的对象数量。

方案是我嵌套了NSManagedObjectContexts,其根类型为NSPrivateQueueConcurrencyType(用于保存到磁盘),由持久性存储和类型为NSMainQueueConcurrencyType的子级支持(用于保存到磁盘)由gui使用)。 (是的,我正在使用MagicalRecord)

我有ViewController在'主'上下文中听NSManagedObjectContextDidSaveNotification。当该通知触发时,countForFetchRequest:error:方法不包括在上下文中进行的未在父根上下文中保存的更改。但是executeFetchRequest:error会返回预期的对象集。

有点奇怪。

答案 2 :(得分:0)

检查几件事:

  1. 第一次通话后error的价值是多少?传递该对象的原因是当出现问题时从中获取信息。
  2. 第一次通话后[request entity]的价值是多少?我可能已经完全离开了,但我非常隐约地记得有关请求是一次性交易的事情:一旦执行它,你必须重置所有各种字段才能再次执行它。确保您的请求的所有属性在第一次调用后仍然有效,或者更好地创建第二个NSFetchRequest实例以执行第二次调用。
  3. 同样,如果你对第一个电话发表评论会怎么样?如果切换通话顺序?一个人的结果可能会影响另一个人。

答案 3 :(得分:0)

我怀疑entitynil(即context是nil,或者没有正确配置的持久存储协调器,其中包含您的实体的托管对象模型,或者您拼错了实体名称在对象模型或调用代码中的某处。在致电entity后确认nil不是+[NSEntityDescription entityForName:inManagedObjectContext:]

答案 4 :(得分:0)

我运行你的方法countEntity:在我自己的一个项目中,它运行良好。我可以让它抛出异常的唯一方法(“_countWithNoChangesForRequest:错误:获取请求必须有一个实体。”)当我错误地将实体的名称(小部件而不是Widgets)大写时。所以,你可能想调查那个方向。

答案 5 :(得分:-1)

您遇到的问题是由于countForFetchRequest的错误使用:错误:实际上,在您的代码片段中,您首先使用executeFetchRequest:error执行获取请求,然后继续使用countForFetchRequest:error:。

从方法文档:

返回给定获取请求传递给executeFetchRequest时返回的对象数:error:。

因此,在调用countForFetchRequest之前,您不能执行获取请求:error:。