iOS Core Data 一对多关系
Posted
技术标签:
【中文标题】iOS Core Data 一对多关系【英文标题】:iOS Core Data one-to-many Relationships 【发布时间】:2014-04-16 01:15:02 【问题描述】:好的,所以我了解获取请求,并且可以访问彼此之间的一对一关系。我很难理解一对多。
我的例子:一个郊区有许多街道,这些街道属于一个郊区。这将创建 NSSet 属性。如何将街道及其属性(即@“名称”)添加到特定郊区。我有一个列出郊区的 TableView,当您单击某个郊区时,它应该显示与该特定郊区相关的街道。
我知道这里还有许多其他核心数据问题,但阅读它们只是出于某种原因并没有在我的脑海中“点击”。
我正在使用 MagicalRecord,但据我了解,我所做的只是最小化我必须编写的代码,因此我需要了解如何在 Core Data 中执行此操作,然后才能在 MR 上尝试它。
【问题讨论】:
我正在使用 MagicalRecord,但据我了解,所做的只是最小化我必须编写的代码,因此我需要了解如何在 Core Data 中执行此操作,然后才能在 MR 上尝试它。 【参考方案1】:1:创建郊区实体的实例:
AppDelegate* appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = [appDelegate managedObjectContext];
Suburb *mySuburb = [NSEntityDescription insertNewObjectForEntityForName:@"Suburb" inManagedObjectContext:context];
2:初始化郊区街道的集合
mySuburb.streets = [[NSMutableSet alloc]init];
3:创建街道:
Street *myStreet = [NSEntityDescription insertNewObjectForEntityForName:@"Street" inManagedObjectContext:context];
4:“链接”两者
myStreet.suburb = mySuburb;
[mySuburb addStreetObject:myStreet];
编辑:以上假设您创建了正确的关系。理想情况下,街道关系属性为级联类型关系,郊区关系属性无效。 如果是这种情况,当您删除一条街道时,它将从属于郊区的街道集中消失。如果你删除一个郊区,它会同时删除所有的街道。
哦,别忘了保存上下文。
【讨论】:
谢谢。那么如何将街道添加到“当前”郊区?这似乎只是将街道添加到郊区 - 或者我在这里的上下文做错了什么?例如:从列表中选择一个郊区,然后添加一条街道。 在 4 中,您将街道添加到郊区(“当前”)郊区的实例中。所以假设你有一些郊区,一个叫做millValley。如果您想将 myStreet 添加到 millValley。只要得到一个指向millValley 的指针,然后你就可以说[millValley addStreetObject:myStreet]。这会将 myStreet 添加到 millValley【参考方案2】:创建查询以检查郊区是否存在。如果没有,创建新的郊区
从 Suburb 获取 NSSet Streets。
如果 NSSet *Suburb == nil -> 创建 Street,将名称分配给该 Street -> 创建新 Suburb 并将 Street 分配给该 Suburb
如果 NSSet *Suburb != nil -> 将新街道插入郊区
希望这个想法对你有所帮助。
【讨论】:
以上是关于iOS Core Data 一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
设置一对多关系 Core Data 和 Magical Record
Core Data 获取请求与 NSFetchedResultsController 的一对多关系