代码之家  ›  专栏  ›  技术社区  ›  GendoIkari

在CoreData中创建多对多关系的正确方法是什么?

  •  0
  • GendoIkari  · 技术社区  · 14 年前

    我有一个名为“Client”的实体,每个客户端都可以有多个“Properties”。CoreData在Client类上为我创建方法,以便向集合中添加新的属性,但我不明白这样做的目的。有什么区别吗

    Property *newProperty = [NSEntityDescription insertNewObjectForEntityForName:@"Property" inManagedObjectContext:self.managedObjectContext];
    newProperty.name = @"[New Property]";
    newProperty.client = self.currentClient;
    

    而这个:

    Property *newProperty = [NSEntityDescription insertNewObjectForEntityForName:@"Property" inManagedObjectContext:self.managedObjectContext];
    newProperty.name = @"[New Property]";
    [self.currentClient addPropertiesObject:newProperty];
    

    据我所知,这两种方法做的是完全相同的事情;它们只是将我的新房产与正确的客户关联起来。一个比另一个好,有什么区别吗?我只想确保我没有遗漏自动生成的“addPropertiesObject”方法的全部要点。谢谢,

    1 回复  |  直到 14 年前
        1
  •  2
  •   Barry Wark    14 年前

    假设关系是双向的(即,反向关系是从两边定义的),那么在您所给出的示例之间没有函数差异。使用代码中最有意义的代码。如果你专注于 Property ,使用 -[Property setClient:] . 同样,使用 -[Client addPropertiesObject:] 如果您的代码感觉集中在 Client .

    为了完整起见,您还可以使用

    Client *client = ...
    Property *property = ...
    [[client mutableSetValueForKey:@"properties"] addObject:property];
    

    它利用可变代理来处理多对多关系,用于键值编码。为了支持上面的显式方法,应该避免使用最后一个选项,因为核心数据可能会优化这些方法(实现细节;我不知道是不是这样)。