如何创建从一个实体到另一个现有实体的核心数据关系?

Posted

技术标签:

【中文标题】如何创建从一个实体到另一个现有实体的核心数据关系?【英文标题】:How can I create a Core Data relationship from one entity to another, existing entity? 【发布时间】:2011-06-22 18:23:01 【问题描述】:

在创建核心数据实体(事件)期间,我正在创建与另一个实体(团队)的关系。这种关系从团队到事件是多对一的(一个团队,许多事件),并且从事件到团队具有反向关系。

团队>活动。

两个关系的删除规则都设置为“无效”。

以下代码块在每个事件的创建过程中创建一个新团队时在第一次填充时成功运行。但是,如果我随后删除一个事件并尝试重新添加它,则会检索现有的团队,但在示例的最后一行中尝试将团队对象添加到事件时代码会失败。报错如下:-[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x699ed60

在 Event 对象与已存在的 Team 对象之间创建关系的正确方法是什么?

Team *currentTeam = self.team;
Team *newTeam = (Team *)[self loadTeamForNid:[NSNumber numberWithInteger: [teamNid integerValue]]];
// If the nid of the referenced team has changed, 
if (![[[currentTeam nid] stringValue] isEqualToString:teamNid]) 
    currentTeam = nil;
    currentTeam = newTeam;


// If an event has not been set by this point, it does not exist in the CD store, and we need to create it.
if (currentTeam == nil) 
    currentTeam = (Team *)[NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:[delegate managedObjectContext]];    
    [currentTeam populateTeamWithNode:[node nodeGet:teamNid]];


// TODO: This breaks on reload of an object
//    self.team = currentTeam;
[self setValue:currentTeam forKey:@"team"];

【问题讨论】:

错误是什么?关系有逆向吗?删除规则是什么? @Benzado:我已更新问题以包含这些详细信息。 【参考方案1】:

从概念上讲,您没有弄错:您将事件的“团队”属性设置为代表相应团队的 NSManagedObject 实例。

此消息:

-[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x699ed60

意味着某行代码正在处理NSDictionary 的实例,它期望(我假设)NSManagedObject 的实例。当它尝试查询对象的managedObjectContext 时,会抛出异常,因为 NSDictionary 没有为该选择器实现方法。

首先要做的是在最后一行设置一个断点,看看currentTeam 是否真的是一个伪装的NSDictionary。 (这似乎不太可能,因为上面的代码会更早地遇到异常。)如果没有,您将不得不四处寻找可能涉及此代码路径的相关属性。

请注意,Core Data 支持获取请求样式,它返回 NSDictionary 实例而不是 NSManagedObjects;如果您在代码中的任何地方使用它,您可能会不小心将结果传递给另一个意想不到的方法。

【讨论】:

以上是关于如何创建从一个实体到另一个现有实体的核心数据关系?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据建议将现有实体置于现有实体中

核心数据:创建关系 [重复]

自定义核心数据映射:在现有关系之间插入新实体

SWIFT 的核心数据:如何从关系实体中删除对象?

如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)

核心数据迁移:将关系从一个实体更改为其父实体后的异常