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

时间:2011-06-22 18:23:02

标签: objective-c ios core-data

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

团队及LT; ----->>事件

两种关系的删除规则都设置为“Nullify”。

在创建每个事件期间创建新团队时,下面的代码块在第一个人口中成功运行。但是,如果我然后删除一个事件并尝试重新添加它,则会检索现有的团队,但是在尝试将Team对象添加到示例的最后一行中的Event时,代码会失败。错误如下:-[__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"];

1 个答案:

答案 0 :(得分:3)

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

这个消息:

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

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

要做的第一件事是在最后一行放置一个断点,看看currentTeam实际上是伪装的NSDictionary。 (这似乎不太可能,因为上面的代码会在之前遇到异常。)如果没有,你将不得不寻找可能涉及此代码路径的相关属性。

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