CoreData 一对多只使用一个实体
Posted
技术标签:
【中文标题】CoreData 一对多只使用一个实体【英文标题】:CoreData one-to-many using just one Entity 【发布时间】:2014-02-06 15:25:48 【问题描述】:当我有两个实体 Parent 和 Child(之间的关系 - “children”,反向 - “parent”)时,获取具体父级的子级很简单,请参见下面的代码:
Parent *parent = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Child" inManagedObjectContext:context]];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
[request setSortDescriptors:@[sort]];
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
NSLog(@"results :%@", results);
是的,当然,我可以在没有 NSFetchRequest 的情况下获得孩子,但就我而言,我必须这样做; 好的,我的麻烦是我只有一个实体,例如“父母”(关系 - “父母”,逆 - “父母”); 一位家长还有另外 3 位家长; 如何让所有父母具体父母;我尝试这样做:
Parent *parent = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Parent" inManagedObjectContext:context]];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
[request setSortDescriptors:@[sort]];
[request setPredicate:[NSPredicate predicateWithFormat:@"(parents == %@)", parent]];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
NSLog(@"results :%@", results);
但是我的程序程序崩溃了: 由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“此处不允许使用多对多键”
【问题讨论】:
显示模型的图像(至少是实体)。你应该有两个相反的关系,两个名字是什么? 相当混乱,数据模型的屏幕截图会有所帮助。 【参考方案1】:即使你只有一个实体,你也需要定义两个关系:
“父”作为从实体到自身的一对一关系,并且 “子”作为实体到自身的多对多关系并使它们彼此成反比关系。那么
[NSPredicate predicateWithFormat:@"(parent == %@)", parent]
应该按预期工作。
【讨论】:
是的,你是对的;我会尽力做到这一点)))非常感谢) Martin,您如何看待 Core Data 中的多对多关系?我想了想,现在我用的是多对多的关系;为了更好地理解想象一下facebook好友,每个好友都可以成为很多用户的好友,并且他可以拥有很多好友;我正在尝试使用一个实体来做到这一点,并在使用 NSFetchRequest 获得朋友具体用户之后 @O.Daniel:我对多对多关系没有任何问题。你有什么问题? @O.Daniel:我不明白最后一部分:“在使用 NSFetchRequest 获得朋友具体用户后” 对不起)好的,再次)想象一下 facebook,在你朋友的个人资料上是他的一些朋友,你想显示他们;我的意思是你显示具体用户的朋友,我想使用 NSFetchRequest 来做到这一点;我希望这是更好的解释;以上是关于CoreData 一对多只使用一个实体的主要内容,如果未能解决你的问题,请参考以下文章
CoreData Parent Children 使用单个实体的一对多反向关系