【问题标题】:create relationship of new objects based on existing managed object property基于现有托管对象属性创建新对象的关系
【发布时间】:2014-07-15 04:10:03
【问题描述】:

我有以下数据模型:

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

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

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

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

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

但我收到以下错误: 'NSInvalidArgumentException',原因:'-[__NSCFString managedObjectContext]:无法识别的选择器发送到实例 0x10939fd00'

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

【问题讨论】:

    标签: core-data save entity relationship managedobjectcontext


    【解决方案1】:

    当您通过关系“属性”将 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。

    【讨论】:

      【解决方案2】:

      我假设您正在使用NSManagedObject 子类。在这种情况下,我建议不要使用繁琐的 setValue 调用,而是使用方便的点表示法。

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

      newEntityE.toD = newEntityD; 
      

      【讨论】:

        猜你喜欢
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 2017-10-24
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        相关资源
        最近更新 更多