Core data CoreData检查多对多关系是否包含对象

Core data CoreData检查多对多关系是否包含对象,core-data,nspredicate,one-to-many,Core Data,Nspredicate,One To Many,我的应用程序中有以下数据模型: 基本上,我想存储国家名称以及城市名称。每个城市属于一个国家,一个国家包含0-n个城市 在我现在向某个国家添加新城市之前,我需要知道该国家是否已经包含具有此名称的城市 到目前为止,我一直在这样做: - (BOOL)countryForName:(NSString *)countryName containsCity:(NSString *)cityName { Countries *country = [self countryForName:countr

我的应用程序中有以下数据模型:

基本上,我想存储国家名称以及城市名称。每个城市属于一个国家,一个国家包含0-n个城市

在我现在向某个国家添加新城市之前,我需要知道该国家是否已经包含具有此名称的城市

到目前为止,我一直在这样做:

- (BOOL)countryForName:(NSString *)countryName containsCity:(NSString *)cityName {
    Countries *country = [self countryForName:countryName];
    NSSet *cityNames = [country valueForKey:@"cities"];
    for (Cities *city in cityNames) {
        if ([city.cityName isEqualToString:cityName]) {
            return YES;
        }
    }
    return NO;
}
这显然非常慢,我需要的是一个具有正确谓词的等价获取。我搜索一个实体,如下所示:

    NSEntityDescription *entity     = [NSEntityDescription entityForName:@"Countries" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor    = [[NSSortDescriptor alloc] initWithKey:@"countryName" ascending:YES];
    NSArray *sortDescriptors            = @[sortDescriptor];
    fetchRequest.sortDescriptors        = sortDescriptors;

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"GetCountryList"];
    aFetchedResultsController.delegate  = self;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryName == %@", countryName];
    [aFetchedResultsController.fetchRequest setPredicate:predicate];
但是,如果搜索涉及多个实体,我该怎么做呢?或者换句话说:如何仅为一个国家添加唯一的城市名称?

多谢各位

如果要检查给定国家/地区对象是否已包含具有名称的城市, 你能行

Countries*国家=。。。
NSString*城市名称=。。。
如果([[country valueForKeyPath:@“cities.name”]包含对象:cityName]){
// ...
}
或者,使用提取请求:

NSString*countryName=。。。
NSString*城市名称=。。。
NSFetchRequest*fetchRequest=[NSFetchRequest fetchRequestWithEntityName:@“国家];
NSPredicate*谓词=[NSPredicate谓词格式:@“countryName==%@和任意城市。cityName==%@”,countryName,cityName];
[FetchRequestSetPredicate:谓词];
n错误*错误;
NSUTEGER count=[self.managedObjectContext countForFetchRequest:fetchRequest错误:&错误];
if(count==NSNotFound){
//错误
}否则如果(计数==0){
//没有匹配的国家
}否则{
//至少有一个匹配的国家
}
请注意,
NSFetchedResultsController
通常用于显示
在表视图中获取请求,因此此处不需要它。

您好,Martin,感谢您的回复。这个解决方案看起来只是对我的代码的一个很小的改进。是否无法创建fetchrequest,然后执行
countForFetchRequest:
为“国家不包含此城市”返回0,或为“国家包含此城市”返回值>0?我真的不喜欢为了减少内存使用而创建对象……我刚刚测试了你的代码,现在它工作得很好。我编辑了你的答案代码,以便其他人可以利用它,非常感谢:)@pmk:不客气(是的,代码中有一些愚蠢的错误)。-我刚刚重新插入了方便的方法
fetchRequestWithEntityName
(现在希望是正确的),它可以保存2行代码。如何获取包含数组中所有城市或其中一个城市的国家/地区?