Iphone ExecuteFetchRequest间歇性地引发具有相同参数的异常&引用;不符合密钥的密钥值编码;

Iphone ExecuteFetchRequest间歇性地引发具有相同参数的异常&引用;不符合密钥的密钥值编码;,iphone,core-data,fetch,key-value-coding,Iphone,Core Data,Fetch,Key Value Coding,编辑多亏了Matt的帖子,我现在明白了我不应该尝试以数组的形式访问“started”。然而,如果是这样的话,我想知道为什么这段代码在其他地方也能工作。在我看来,这应该是“一个或另一个”。它应该起作用,或者不起作用 原创 我在代码的不同部分使用相同的获取请求来查找最新的游戏: Game *lastGame = [[[CoreDataAccess managedObjectContext] fetchObjectsForEntityName:@"Game" withPredicate:@"start

编辑多亏了Matt的帖子,我现在明白了我不应该尝试以数组的形式访问“started”。然而,如果是这样的话,我想知道为什么这段代码在其他地方也能工作。在我看来,这应该是“一个或另一个”。它应该起作用,或者不起作用

原创 我在代码的不同部分使用相同的获取请求来查找最新的游戏:

Game *lastGame = [[[CoreDataAccess managedObjectContext] fetchObjectsForEntityName:@"Game" withPredicate:@"started == started.@max"] anyObject];
“游戏”是一个NSManagedObject,“开始”是一个日期属性在awakeFromInsert中,每个对象只设置一次“已启动”。从那以后就再也不会改变了。游戏从不直接实例化,但它有三个子类。我尝试过让游戏既抽象又具体,但这两种方法都不能解决这个问题

我正在使用NSManagedObjectContext类别执行提取,如这里的cocoa with love所示

我得到的错误如下:

Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  [<__NSDate 0xebb1130> valueForUndefinedKey:]: this class is not key value coding-compliant for the key @max. with userInfo {
    NSTargetObjectUserInfoKey = "2010-11-06 11:16:53 GMT";
    NSUnknownUserInfoKey = "@max";
}
还有这里:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
    Game *lastGame = [[[CoreDataAccess managedObjectContext] fetchObjectsForEntityName:@"Game" withPredicate:@"started == started.@max"] anyObject];
    if (lastGame == [frc objectAtIndexPath:indexPath])
        return NO;
    return YES;
}
这个精确的获取在几个地方执行多次,例如在启动时,但它只在一个类中崩溃。正如我所说,它是间歇性的,但似乎是在我创建一个新的游戏对象之后的某个时候。游戏是在一个选项卡中创建的,上面的代码来自显示历史的第二个选项卡


我也看到过类似的错误。在这种情况下,通过重新启动计算机解决了问题,最终允许XCode意识到该属性已从模型中删除。我已经试过了,但我仍然遇到这个问题。我还尝试删除并重新创建模型中的“started”属性。我还阅读了《核心数据疑难解答指南》,但也找不到任何帮助。

谓词一次应用于一个源对象。如果源对象没有数组属性,则不能使用数组运算符

在你的例子中,谓词说:

看一个给定的“游戏”。如果是自己的 “已启动”属性等于它自己的属性 使用@max KVC“启动”属性 应用数组运算符,然后 谓词将为true

这不是你想要的。在谓词中使用KVC数组运算符的唯一情况是对象上的属性是数组。e、 g

获取“games.@max.homeTeamScore>50”的每个“赛季”(即主队在一场比赛中得分超过50分的赛季)。这将起作用,因为“季节”上的“游戏”属性将是一个数组,因此games.homeTeamScore也将是一个数组

但是,单个游戏的“开始”属性不是数组。您想要操作的数组实际上是所有游戏的数组,它不是游戏的属性

访问所有游戏的数组的唯一方法是首先获取所有游戏的数组,然后在谓词外部应用数组运算符,然后在谓词内部仅应用相等测试

i、 e.首先获取所有游戏,然后使用以下工具重新蚀刻:

fetchObjectsForEntityName:@"Game" withPredicate:@"started == %@", [allGames valueForKey:@"@max.started"]
但这也不是明智之举

最终,用最新的开始日期获取游戏的正确方法是无法用单行获取方法完成的


您需要创建一个方法变体,允许您在获取请求上设置OrtDescriptor(按“开始”排序,降序),然后在获取请求上设置FetchLimit:1,以仅获取第一个结果。

Matt,感谢您的回复,也感谢您的优秀站点!这对我理解谓词应该如何工作非常有帮助。另外,我完全理解我可以将所有游戏作为一个排序数组来获取,并获取第一个值。(虽然我没有意识到我可以将获取限制为一个结果!)但我想我的问题的根源是,为什么我的获取有时会起作用?我在ApplicationIDFinishLaunching中使用了相同的代码,并使用isKindOfClass来加载相应的视图,它可以工作,即使我理解正确,它也不应该工作。知道为什么吗?
fetchObjectsForEntityName:@"Game" withPredicate:@"started == %@", [allGames valueForKey:@"@max.started"]