使用谓词的核心数据中的关系值

时间:2012-12-14 15:59:52

标签: objective-c core-data nspredicate

首先,我要为这个愚蠢的问题道歉。不幸的是,在阅读了这么多帖子后,我无法弄清楚如何实现。对不起。所以,这是我的问题:我有两个实体,地区和国家。每个地区属于一个国家,每个国家都有几个地区。在我的应用程序中,我选择了一个国家并希望显示其所有区域。为了保持简单,国家和地区都具有属性名称,并且区域具有关系“国家”。现在我必须选择一个国家的所有地区:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *desc = [[model entitiesByName] objectForKey:@"Region"];
[request setEntity:desc];

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sd]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any country LIKE[c] 'aCountry'"];
[request setPredicate:predicate];

那个看起来不错,但不起作用,因为国家是一种关系,因此国家的名称不存储在关系中,而是存储在实体国家。然后我尝试了另一种方式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"any Country.name LIKE[c] 'aCountry'"];

这会导致错误:

NSInvalidArgumentException',原因:'在实体中找不到keypath Country.name

现在,获取我的地区的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

如果aCountry国家/地区实体的对象, 和 country 是从 Region Country 的一对一关系, 然后,以下获取请求将查找该国家/地区的所有区域:

Country aCountry = ... ;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Region"];
// ... add sort descriptor (optional)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"country = %@", aCountry];
[request setPredicate:predicate];

但请注意,如果您还从国家/地区地区定义了反对多关系地区,那么您将获得所有地区国家只是

NSSet *regionsForCountry = aCountry.regions;

或者,如果您更喜欢数组:

NSArray *regionsForCountry = [aCountry.regions allObjects];