2010-08-06 94 views
6
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游戏,我做了一些代码,我使用的核心数据存储水平。当一个级别完成并获胜时,我想设置该级别的最佳时间。所花费的时间是计算出来的,如果它比以前的最佳时间好,我想把它设置为关卡的最佳时间。实体不是键值编码兼容的关键

当它尝试从self.puzzle(它是来自Core Data的NSManagedObject)检索最佳时间时,此代码在'int bestTime'行上失败。最佳时间以核心数据模型中的整数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]; 
+0

'bestTime'是您之后添加到模型中的属性吗?即这可能是一个迁移问题吗? – 2010-08-06 23:39:08

+0

我以后再添加它,但我从模拟器中删除了应用程序并重新安装了它。 – danpalmer 2010-08-06 23:45:02

+0

我也重置了模拟器的内容和设置,但它仍然不起作用。与以前一样的错误。 – danpalmer 2010-08-06 23:47:11

回答

14

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

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

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

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

+0

我最近看到这个问题很多,大多数时候它似乎是由模拟器中的应用程序包导致的,它保留了以前版本的数据模型中旧的.mom文件。出于某种原因,模型更改时并不总是会被清除。重新启动机器导致模拟器建立一个全新的应用程序目录,从而解决问题。从模拟器中删除应用程序也会修复它。 – TechZen 2010-08-09 11:18:18

+0

我曾尝试删除模拟器中的应用程序。这个问题实际上是Xcode认为它已经把'bestTime'属性放进去了,但实际上并没有这样做。 – danpalmer 2010-09-03 12:48:32

+1

重新启动OS X帮助。谢谢。重新启动Xcode,清除代码或从设备上删除应用程序都无济于事。在OS X重新启动后重新启动Xcode时,模型的差异很明显,这次它表现得很好。感谢提示! – 2011-08-04 08:33:45

11

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

+0

我在我的项目中的xcdatamodel文件中定义了“bestTime”,就像我正在访问的所有其他东西一样。我试图直接从该文件复制并粘贴名称。 – danpalmer 2010-08-06 23:34:48

+0

它是否与您尝试访问的实体完全相同? – Joshua 2010-08-07 10:54:15

+0

是的。我在未能打印出我知道工作的其他属性的行之前放入了一些日志。我将输出与应该是什么进行了比较,并且它是相同的模型。 – danpalmer 2010-08-07 11:10:22

1

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

+0

我会看看那个。谢谢。至于初始化,我不知道。我在托管对象上下文上执行了一个获取请求,并将结果放入可变字典中。该对象仅取自基于哪个tableviewcell被按下的对象。 – danpalmer 2010-08-07 00:07:42

+0

danpalmer:请编辑您的问题以包含获取请求。 – 2010-08-07 04:46:03

1

如果您在以后将属性bestTime添加到模型中,您可能已经忘记将它们的声明和实现放入连接的受管对象类中。

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

+0

拼图不是我从NSManagedObject继承而来的类,它只是一个NSManagedObject。从我读过的关于Core Data的内容可以看出,如果你没有任何代码需要在对象上运行,那么这是一个好方法。对我而言,它只是一组属性。就这些。 – danpalmer 2010-08-07 10:25:37

2

我确实通过删除并重新创建数据模型解决了同样的问题,然后重新清理然后重新生成。 我认为这个bug是由于核心数据有时不会更新某些数据而引起的。

0

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

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

相关问题