【问题标题】:Core data relationship fault : null key核心数据关系故障:空键
【发布时间】:2012-10-24 06:44:46
【问题描述】:

我有一个名为 Person 的实体,它可能有一个家,而一个名为 Home 的实体可能有一个到 N 个家:

然后我有两个数组控制器:

  1. Homes Controller,绑定托管对象上下文,实体模式:Home;
  2. 人员控制器,与托管对象上下文绑定,实体模式:人员。

我有一个基于单元格的表格视图,与人员控制器绑定。我能够成功显示前三列(姓名、姓氏和年龄),但问题在于第四列:家庭名称。在里面列有一个弹出按钮单元格,这些是绑定:

  • 内容:Homes Controller.arrangedObjects ;
  • 内容值:Homes Controller.arrangedObjects.name;
  • 选定对象:People Controller.home。

问题出现在运行时,当我尝试点击弹出按钮选择主页时:

就像你看到的,而不是选择我看到“核心数据关系错误”,如果我尝试通过单击菜单项来更改主页,我会看到很多代码打印到控制台,我只发布了最重要行:

2012-11-04 01:47:45.181 Test[4390:303] [<NSManagedObject 0x100156e60> valueForUndefinedKey:]: the entity Home is not key value coding-compliant for the key "(null)".

在此之后应用程序冻结。

编辑:通过一些调试,我现在能够知道异常发生时对象的状态:

2012-11-09 02:42:02.495 Test[4650:303] <NSManagedObject: 0x100157460> (entity: Person; id: 0x10013d9d0 <x-coredata:///Person/t0182F6F4-9CCC-4F51-A82F-D00CE026DB752> ; data: {
    age = 20;
    home = "0x101953480 <x-coredata:///Home/t0182F6F4-9CCC-4F51-A82F-D00CE026DB753>";
    name = "New Name";
    surname = "New Surname";
})
2012-11-09 02:42:02.497 Test[4650:303] <NSManagedObject: 0x101953420> (entity: Home; id: 0x101953480 <x-coredata:///Home/t0182F6F4-9CCC-4F51-A82F-D00CE026DB753> ; data: {
    name = "New Home";
    people =     (
        "0x10013d9d0 <x-coredata:///Person/t0182F6F4-9CCC-4F51-A82F-D00CE026DB752>"
    );

似乎值是常规的,没有 nil 键。我怀疑问题出在绑定上。

【问题讨论】:

  • 那么家庭名称的默认值是什么。也许那没有设置,它是空的?
  • 默认值是“新家”,确实在表格视图中所有的家都已经有了一个名字。但是它说 Home 没有响应键 null。所以可能在绑定中我是提供一个为空的关键路径,但我不明白出了什么问题,名称不是 nil。所以我敢打赌绑定有问题。在弹出按钮中选择的对象是 People Controller.home。是吗?

标签: objective-c core-data relationship osx-mountain-lion xcode4.5


【解决方案1】:

为了正常运行,需要使用模型构建器将 Home-people 和 Person-home 声明为彼此的反向关系。然后该关系将显示为一行。

【讨论】:

  • 我忘了说:它们已经是相反的了。
【解决方案2】:

如果不了解如何从 Core Data 中获取对象及其关系,就很难判断实际发生了什么。

但是,仅仅因为您看到“故障”这个词并不意味着存在问题。核心数据错误只是意味着数据尚未从存储中检索到托管对象上下文中。

故障非常方便。它们就像代表关系中对象的小存根,这样您就不会过多地进入内存。只有当您尝试访问对象时,它们才会被替换为实际对象。

更多解释请参见Core Data Relationship Fault

【讨论】:

  • 我都是用cocoa绑定做的,我以为都是自动的,要不要手动同步数据库?
猜你喜欢
  • 2012-09-07
  • 2010-12-22
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多