【问题标题】:Entity is not key value coding-compliant for the key实体与键的键值编码不兼容
【发布时间】:2011-03-26 14:14:15
【问题描述】:
    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。最佳时间在核心数据模型中存储为整数 32。它失败并出现 SIGABRT 错误。

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

我已经在网上搜索了为什么会发生这种情况以及如何解决它,但似乎没有任何帮助。在其他地方,我可以从 Core Data 模型中访问整数值,它们运行良好,尽管它们用于过滤和排序查询。

我也不知道我设置值的那一行行不行。

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

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

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

【问题讨论】:

  • “bestTime”是您后来添加到模型中的属性吗? IE。这可能是迁移问题吗?
  • 我后来确实添加了它,但我从模拟器中删除了应用程序并重新安装了它。
  • 我也重置了模拟器的内容和设置,还是不行。和以前一样的错误。

标签: objective-c cocoa core-data


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我确实通过删除并再次创建数据模型并清理然后再次重建来解决相同的问题。 我认为该错误是由于核心数据有时不会更新内部的某些数据造成的。

    【讨论】:

      【解决方案3】:

      好的,首先,我要感谢所有提出想法的人。他们可能没有帮助我解决问题,但我了解了更多有关 Core Data 的知识,并且当事情不工作时找出我应该检查的内容总是很好的。

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

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

      再次感谢大家的帮助,抱歉解决方案不是更有趣且基于代码。尽管我的代码不是原因让我感觉更好。

      【讨论】:

      • 我最近经常看到这个问题,而且大多数情况下它似乎是由模拟器中的应用程序包保留了以前版本的数据模型中的旧 .mom 文件引起的。由于某种原因,模型更改时并不总是清除它。重新启动机器会导致模拟器构建一个全新的应用程序目录,从而解决问题。从模拟器中删除应用程序也会修复它。
      • 我曾尝试在模拟器中删除该应用程序。问题实际上在于 Xcode 认为它已经放入了“bestTime”属性,但实际上并没有这样做。
      • 重启 OS X 有帮助。谢谢你。重新启动 Xcode、清理代码或从设备中删除应用程序没有帮助。在 OS X 重新启动后重新启动 Xcode 时,模型的差异很明显,这一次它表现得很好。感谢您的提示!
      • 非常有帮助,我有同样的问题好几天了。现在我重新启动了设备,清理了 Xcode,重新启动我的 Mac 并删除了应用程序,它神奇地工作了..
      • 这太疯狂了!我在另一台计算机上更新了核心数据,推送到 git 存储库并拉入我的计算机。我不得不再次保存它而不改变任何东西!一定是一个 XCode 错误。我使用雪豹,XCode 4.2。你的回答为我节省了很多时间!非常感谢!
      【解决方案4】:

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

      尝试 Design -> Data Model -> Copy Objective-C ... Method Declarations/Implementations to Clipboard 中提供的便利操作(编辑模型文件时)。

      【讨论】:

      • Puzzle 不是我写的继承自 NSManagedObject 的类,它只是一个 NSManagedObject。根据我所读到的有关 Core Data 的内容,如果您没有任何需要在对象上运行的代码,这是一种不错的方法。对我来说,它只是属性的集合。就是这样。
      【解决方案5】:

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

      【讨论】:

      • 我会看看那个。谢谢。至于初始化,我不知道。我在我的托管对象上下文中执行了一个获取请求,并将结果放入一个可变字典中。该对象只是根据按下的 tableviewcell 取自那个对象。
      • danpalmer:请编辑您的问题以包含获取请求。
      【解决方案6】:

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

      【讨论】:

      • 我在我的项目的 xcdatamodel 文件中定义了“bestTime”,就像我正在访问的所有其他内容一样。我已尝试直接从该文件中复制和粘贴名称。
      • 它肯定在您尝试访问的同一实体中吗?
      • 是的。我在无法打印出我知道有效的其他属性的行之前放入了一些日志。我已经将输出与应有的输出进行了比较,并且它是相同的模型。
      猜你喜欢
      • 2013-10-11
      • 2014-03-26
      • 2019-08-20
      • 2013-05-23
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多