Core Data 获取关系对象

Posted

技术标签:

【中文标题】Core Data 获取关系对象【英文标题】:Core Data fetching relationship objects 【发布时间】:2013-12-26 16:57:55 【问题描述】:

在我的应用程序中,我有两个实体:成员和列表。它们都有一对多的关系(成员可以有多个列表,列表可以有多个成员)。现在我想获取属于特定成员的列表。这是我的代码:

WSAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Lists" inManagedObjectContext:context];

[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"has_members contains[cd] %@", [self.currentMember valueForKey:@"name"]]];

[fetchRequest setPredicate:predicate];

NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) 
    // Handle the error.
    NSLog(@"NO LISTS AVAILABLE IN REFRESH");

self.currentMember 是用户自己的托管对象。

注意:成员有名字,(NSSet*) member_of_list

list 有 list_name, has-members

问题:当我运行代码时,它在 fetchedObjects 数组中中断。我怀疑 NSPredicate 有问题,但我不知道在哪里以及如何修复它。谁能指出问题所在?

【问题讨论】:

您希望所有记录都针对某个记录... 【参考方案1】:

首先,您描述的Member(以复数形式调用实体令人困惑)和List 之间的关系是多对多的。

其次,您没有使用 CoreData 固有的对象图功能,而是在实体之间“滚动您自己的”关系(您应该使用您的界面构建器来为两个实体之间的 CoreData 关系建模)。

请参阅HERE 如何做到这一点。

对数据建模后,谓词应如下所示:

//Not tested
NSPredicate* p = [NSPredicate predicateWithFormat:@"ANY members = %@",self.currentMember];

请勿传递格式化字符串来创建谓词,使用NSPredicate 格式替换参数,否则您将无法实现目标(在大多数情况下)。

【讨论】:

以上是关于Core Data 获取关系对象的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Core Data 中的关系项属性?

在 Core Data 中获取过滤的关系

iOS Core Data NSFetchRequest groupby 关系对象

Restkit:当外键引用Core Data中缺少的本地对象时获取远程链接对象

向 Core Data 添加唯一对象

Core Data 中的异步对象构造