我是CoreData的新手,对它有一个相对较好的把握,除了现在我开始关注并需要一些帮助。
我的应用中的一个问题让我想一想,我有两个实体,TableInfo和PersonInfo。
一张桌子可以让很多人坐在那里,但一个人只能坐在一张桌子旁。所以我知道在这方面它会是一对多的关系,它也会产生现实世界的感觉。
无论如何,在我的应用程序中,我向我的人添加了一张桌子,所以我基本上说,这些人坐在这张桌子上。但是,如果我去删除我已经给过的人的表格,我该如何处理呢?
我认为关系可能会在这里发挥作用,但我之前从未与他们合作过,所以我很难理解去哪里。
如果有人知道任何有助于解决此问题或详细说明核心数据关系的好教程,或者您可以提供帮助,我将非常感谢,谢谢,或者让我知道我是否因为这种关系咆哮错误的树问题。
谢谢!
答案 0 :(得分:3)
这是一种使用核心数据关系的好情况。
通常的Apple文档(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html)会让您很好地掌握它的工作原理。
简而言之,对于关系,您可以指定删除规则。 在您的情况下,您可能会选择“Nullify”。这意味着,如果删除该表,则Person的table-property将变为null,表示您的人不再坐在桌子上。
编辑:你也可以指定“Cascade”,它会将这个人与桌子一起删除(相当无意义,但有点有趣的想法)。或者,您可以指定“拒绝”,如果至少有一个人仍在桌面上,则会中止删除。
示例:
假设您有两个实体,“TableInfo”和“PersonInfo”。 “PersonInfo”具有名为“table”的关系,“TableInfo”具有名为“people”的关系。 “table”是以“TableInfo”为目标的一对一关系。 “人”是与“人物信息”作为目标的多对多关系。
现在将“人物”的“反向关系”设置为“表格”。 “表格”的“反向关系”将自动设置为“人物”。
如果你让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,但对于“基本”需求,互联网上的教程将更加完整和有用。
答案 1 :(得分:0)
看一下讲座12和关于如何建立关系的快门插图示例。他使用摄影师拍摄照片关系,这与你的桌子和人际关系相同。 2010-11秋季或春季,CS193P下的iTunesU仍可提供此讲座。
此链接提供幻灯片和示例。 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-fall