【问题标题】:CoreData Relationship UseCoreData 关系使用
【发布时间】:2012-04-09 10:34:31
【问题描述】:

我是 CoreData 的新手,对它的掌握相对较好,但现在我开始关注关系并需要一点帮助。

我的应用程序中的一个问题让我思考,我有两个实体,TableInfo 和 PersonInfo。

一张桌子可以坐很多人,但一个人只能坐一张桌子。所以我知道在这方面这将是一对多的关系,并且在现实世界中也很有意义。

无论如何,在我的应用程序中,我为我的人添加了一张桌子,所以我基本上说,这个人坐在这张桌子旁。但是,如果我再去删除我已经给一个人的表,我该如何处理?

我认为人际关系可能会在这里发挥作用,但我以前从未与他们合作过,所以我很难理解该去哪里。

如果有人知道任何可以帮助解决此问题或详细说明核心数据关系的好的教程,或者您可以提供帮助,我将不胜感激,谢谢,或者让我知道我是否为此找错了关系树问题。

谢谢!

【问题讨论】:

    标签: iphone objective-c cocoa-touch core-data entity-relationship


    【解决方案1】:

    这是一个很好的情况,您可以使用 Core Data 关系。

    通常的 Apple 文档 (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html) 会让您很好地掌握它的工作原理。

    简而言之,您可以为关系指定删除规则。 在您的情况下,您可能会选择“无效”。这意味着,如果您删除该表,您的 Person 的 table-property 将变为 null,表示您的人不再坐在桌子上。

    编辑:您还可以指定“级联”,这将删除人员和表格(相当无意义,但有点有趣的想法)。或者,您可以指定“拒绝”,如果至少还有一个人坐在桌子上,这将中止删除。

    例子:

    假设您有两个实体,“TableInfo”和“PersonInfo”。 “PersonInfo”有一个名为“table”的relationship,“TableInfo”有一个名为“persons”的relationship。 “table”是以“TableInfo”为目标的一对一关系。 “persons”是以“PersonInfo”为目标的一对多关系。

    现在将“persons”的“反向关系”设置为“table”。 “表”的“反向关系”将自动设置为“人”。

    如果你让 CoreData 生成你的模型子类(你应该!),你最终会得到一个像这样的类:

    @interface TableInfo : NSManagedObject
    
    @property (nonatomic, retain) NSSet *persons;
    @end
    
    @interface TableInfo (CoreDataGeneratedAccessors)
    
    - (void)addPersonsObject:(PersonInfo *)value;
    - (void)removePersonsObject:(PersonInfo *)value;
    - (void)addPersons:(NSSet *)values;
    - (void)removePersons:(NSSet *)values;
    

    如您所见,CoreData 会自动为您创建适当的访问器。只需使用它们。

    您现在可以执行以下操作:

    TableInfo* myTable = [NSEntityDescription insertNewObjectForEntityForName:@"TableInfo" inManagedObjectContext:self.managedObjectContext];
    
    PersonInfo* myPerson = [NSEntityDescription insertNewObjectForEntityForName:@"PersonInfo" inManagedObjectContext:self.managedObjectContext];
    
    [myTable addPersonsObject:myPerson];
    NSLog(@"%@", myPerson.table); // will be your TableInfo object "myTable"
    

    简而言之,请阅读我上面链接的文档,那里和互联网上有很多示例。随意提出关于 SO 的问题,但对于“基本”需求,互联网上的教程将更加完整和有用。

    【讨论】:

    • 啊非常有用。但是,您如何将一个人添加到表格中?因为人不是表的属性,实体不能是实体的属性。
    • 只需定义关系并让 CoreData 为您创建类。您可以访问与属性相同的关系,即为您提供 [TableInfo addPersonInfo:] 和 [PersonInfo setTableInfo:] 等。
    • 感谢您迄今为止的帮助,很抱歉您将不得不忍受我。不过,事情正在变得明朗起来。我的应用程序中的核心数据使用基于 Apple 自己的 CoreData Books 示例代码。因此,例如用户可以使用 UINavigationViewController 跳转,选择一个客人,然后编辑该客人的属性,例如其名称和表格。有了这种关系,我是不是把表属性当作正常的?而是使用关系名称作为键?等
    • 只是一些额外的细节。假设用户在列表中选择了某人,然后他们选择编辑他们的姓名,简单,新视图,键入姓名,将字符串保存到核心数据中。但是,如果我想给那个人分配一个表,我选择给他们一个表,新视图,用户看到一个表列表,选择一个(我有那个,没有问题)然后呢?我应该如何使用这种关系?这就是让我难过的地方。
    • 你很可能没有#import "TableInfo.h"
    【解决方案2】:

    看看第 12 课和关于如何建立关系的 shutterbug 示例。他使用摄影师与照片的关系,这与您的桌子与人的关系相同。在 2010-11 年秋季或春季期间,该讲座可能仍可在 CS193P 下的 iTunesU 上获得。

    此链接提供幻灯片和示例。 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-fall

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多