【问题标题】:CoreData one-to-many using just one EntityCoreData 一对多只使用一个实体
【发布时间】: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”而终止应用,原因:“此处不允许使用多对多键”

【问题讨论】:

  • 显示模型的图像(至少是实体)。你应该有两个相反的关系,两个名字是什么?
  • 相当混乱,数据模型的屏幕截图会有所帮助。

标签: ios objective-c core-data


【解决方案1】:

即使你只有一个实体,你也需要定义两个关系

  • “父”作为从实体到自身的一对一关系,并且
  • “子”作为实体到自身的多对多关系

并使它们彼此成反比关系。那么

[NSPredicate predicateWithFormat:@"(parent == %@)", parent]

应该按预期工作。

【讨论】:

  • 是的,你是对的;我会尽力做到这一点)))非常感谢)
  • Martin,您如何看待 Core Data 中的多对多关系?我想了想,现在我用的是多对多的关系;为了更好地理解想象一下facebook好友,每个好友都可以成为很多用户的好友,并且他可以拥有很多好友;我正在尝试使用一个实体来做到这一点,并在使用 NSFetchRequest 获得朋友具体用户之后
  • @O.Daniel:我对多对多关系没有任何问题。你有什么问题?
  • @O.Daniel:我不明白最后一部分:“在使用 NSFetchRequest 获得朋友具体用户后”
  • 对不起)好的,再次)想象一下 facebook,在你朋友的个人资料上是他的一些朋友,你想显示他们;我的意思是你显示具体用户的朋友,我想使用 NSFetchRequest 来做到这一点;我希望这是更好的解释;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多