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 使用单个实体的一对多反向关系

CoreData 在一对多关系中编辑一个属性

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

CoreData不删除对象一对多实体

CoreData派生属性查看一对多关系是不是包含属性

一对多关系的CoreData谓词