实体不是密钥的密钥值编码兼容

时间:2010-08-06 22:46:19

标签: objective-c cocoa core-data

    if (win) {
    // Game was won, set completed in puzzle and time
    // Calculate seconds taken
    int timeTaken = (int)([NSDate timeIntervalSinceReferenceDate] - self.gameStartTime);
    int bestTime = [[self.puzzle valueForKey:@"bestTime"] intValue];
    if (timeTaken < bestTime && bestTime != 0) {
        [self.puzzle setValue:[NSNumber numberWithInt:timeTaken] forKey:@"bestTime"];
        NSLog(@"Best time for %@ is %@", [self.puzzle valueForKey:@"name"], [self.puzzle valueForKey:@"bestTime"]);
    }
}

这是我正在制作的iPad游戏中的一些代码,我正在使用Core Data来存储关卡。当一个关卡完成并获胜后,我想为该关卡设置最佳时间。计算所花费的时间,如果它比之前的最佳时间更好,我想将其设置为该级别的最佳时间。

当它试图从self.puzzle中检索最佳时间时,此代码在'int bestTime'行上失败,self :: puzzle是来自Core Data的NSManagedObject。最佳时间存储为Core Data模型中的Integer 32。它因SIGABRT错误而失败。

'[<NSManagedObject 0x95334d0> valueForUndefinedKey:]: the entity Puzzle is not key value coding-compliant for the key "bestTime".'

我已经在网上搜索了为什么会发生这种情况以及如何修复它的原因,但似乎没有任何帮助。还有其他地方可以从Core Data模型中访问Integer值,它们可以很好地工作,尽管它们用于过滤和排序查询。

我也不知道我设置值的行是否有效。

对此的任何帮助将不胜感激。

编辑:这是获取一系列谜题的代码,其中一个被认为是上述谜题。

// Define our table/entity to use  
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Puzzle" inManagedObjectContext:managedObjectContext];   

// Setup the fetch request  
NSFetchRequest *request = [[NSFetchRequest alloc] init];  
[request setEntity:entity];   

// Set the filter for just the difficulty we want
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"difficulty == %d", difficulty];
[request setPredicate:predicate];

// Define how we will sort the records  
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortid" ascending:YES];  
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];  
[request setSortDescriptors:sortDescriptors];  
[sortDescriptor release];

// Fetch the records and handle an error  
NSError *error;  
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

6 个答案:

答案 0 :(得分:14)

好的,首先,我要感谢所有提出想法的人。他们可能没有帮助我解决问题,但我学到了更多关于核心数据的知识,当事情不起作用时,找出我应该检查的内容总是好的。

我真的不知道问题是什么。直到今天早上,我认为Xcode打开了大约5天,昨天我将属性“bestTime”添加到数据模型中。我只能假设在5天内,Xcode变得有点不稳定,并认为它没有被保存。我已经检查过我保存了模型属性,实际上我必须检查3到4次,以及在我做出任何更改后我按下Command + S的习惯。

无论如何,我今天早些时候重新启动了我的机器,当我几分钟前启动Xcode时,我发现'bestTime'不在模型文件中。我添加了它,重置iPad模拟器上的设置并且它有效。

再次感谢大家的帮助,对不起解决方案不是更有趣并且基于代码。虽然这让我感觉更好,但我的代码不是原因。

答案 1 :(得分:11)

该托管对象没有名为“bestTime”的属性。根据异常消息,它肯定是一个Puzzle,所以你没有在你的模型中声明一个名为bestTime的属性(或者你拼错了它或者以不同方式大写它)。

答案 2 :(得分:2)

我确实通过删除解决了同样的问题并再次创建数据模型并清理然后再次重建。 我认为该错误是由核心数据有时无法更新某些数据引起的。

答案 3 :(得分:1)

我认为这里没有足够的信息来确定原因。您可以尝试阅读Core Data Troubleshooting Guide;一个可能的原因可能是你使用普通的init而不是initWithEntity初始化了这个特定的Puzzle实例。

答案 4 :(得分:1)

如果您稍后将属性 bestTime 添加到模型中,您可能忘记在连接的托管对象类中为它们添加声明和实现。

尝试设计中提供的便利措施 - &gt;数据模型 - &gt;复制Objective-C ...方法声明/实现到剪贴板(编辑模型文件时)。

答案 5 :(得分:0)

如果将JSON解析为托管对象,请确保使用coreDataPropertyName属性而不是JSON中的json-key-name密钥。当他们的名字如此相似时容易混淆。

这个错误让我疯了,因为我使用image-url而不是imageURL

相关问题