基于现有托管对象属性创建新对象的关系

时间:2014-07-14 14:16:03

标签: core-data save entity relationship managedobjectcontext

我有以下数据模型:

entityA<-->>entityB<<-->>entityC
entityD<-->>entityE

请注意,entityD和entityE与A-C没有关系。

My DetailViewController从托管对象获取属性,并作为新的托管对象保存到managedObjectContext。

我目前在UILabels中显示现有的托管对象,如下所示:

UILabel1.text = [self.selectedEntityB nameB];
UILabel2.text = [self.selectedEntityA nameA];

然后我在这里保存到保存操作中的上下文:

- (IBAction)save:(id)sender {
    EntityD *newEntityD = [NSEntityDescription insertNewObjectForEntityForName:@"EntityD"
                                                      inManagedObjectContext:self.managedObjectContext];

    [newEntityD setValue:self.UILabel2.text forKey:@"nameD"];    

    EntityE *newEntityE = [NSEntityDescription insertNewObjectForEntityForName:@"EntityE"
                                                      inManagedObjectContext:self.managedObjectContext];

    [newEntityE setValue:self.UILabel1.text forKey:@"nameE"];

    NSError *anyError = nil;
    BOOL savedSuccessfully = [self.managedObjectContext save:&anyError];
    if (!savedSuccessfully) {

    }
}

这适用于设置nameD和nameE。我尝试在EntityD和EntityE的新创建的对象之间创建关系。让我们说从entityE到entityD的关系是toD。我已经尝试过保存操作:

  [newEntityE setValue:self.UILabel2.text forKey:@"toD"];

但我得错误: &#39; NSInvalidArgumentException&#39;,原因:&#39; - [__ NSCFString managedObjectContext]:无法识别的选择器发送到实例0x10939fd00&#39;

如何在新创建的对象之间建立关系?

2 个答案:

答案 0 :(得分:0)

我假设你正在使用NSManagedObject子类。在这种情况下,我建议远离繁琐的setValue调用,而是使用方便的点符号。

toD的关系指向EntityD对象,因此它不能是文本字段中的字符串。改为设置entityD:

newEntityE.toD = newEntityD; 

答案 1 :(得分:0)

当您通过关系“property”将EntityD分配给EntityE时,会隐式创建关系。查看每个实体的头文件。您应该在EntityE中拥有这样的属性(给定从E到D的一对一关系):

@property (nonatomic, retain) EntityD *toD;

这意味着你必须通过它的关系属性toD将一个EntityD'对象'分配给newEntityE,如下所示:

// assuming EntityD has some property like NSString *name then
newEntityD.name = self.UILabel2.text;
newEntityE.toD = newEntityD;

看起来您正在尝试直接分配NSString,而不是更新newEntityD的name属性,然后通过关系将newEntityD对象分配给newEntityE。