Core data NSFetchedResultsController在谓词中使用CONTAINS时崩溃

Core data NSFetchedResultsController在谓词中使用CONTAINS时崩溃,core-data,ios6,nspredicate,Core Data,Ios6,Nspredicate,实体包含CLPlacemark属性。 我想检查city字符串是否与placemark的locality属性匹配 在谓词中使用CONTAINS时,在performFetch上发生崩溃 predicate = [NSPredicate predicateWithFormat:@"placemark.locality CONTAINS[cd] %@", city]; [_fetchedResultsController.fetchRequest setPredicate:predicate];

实体包含
CLPlacemark
属性。 我想检查
city
字符串是否与placemark的locality属性匹配

在谓词中使用
CONTAINS
时,在
performFetch
上发生崩溃

predicate = [NSPredicate predicateWithFormat:@"placemark.locality CONTAINS[cd] %@", city];
[_fetchedResultsController.fetchRequest setPredicate:predicate];
        NSError *error = nil;
        if (![[self fetchedResultsController] performFetch:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

核心数据中保存的placemark不能是
CLPlacemark
,因为核心数据不支持该类型

那么,谓词中的
placemark
是否是一个NSManagedObject,其属性
locality
类型为NSString?如果不是,则崩溃不是由于包含,而是由于谓词试图访问不存在的属性
placemark.locality


因此,如果您的placemark作为二进制数据类型保存在核心数据中,则无法访问其组件,也无法编写引用其Location属性的谓词。

placemark是可转换类型,在实体类中设置为CLPlacemark。好的,谢谢,我想我会尝试在类中为局部性创建getter方法来解决这个问题,如果它是一个可转换的类型,您就不能在谓词中访问
局部性。您必须创建一个
Placemark
实体。对于新的Placemark实体,您可以添加您感兴趣并希望保存到核心数据的
CLPlacemark
的任何属性(例如
locality
)。因此,您在核心数据中没有完整的ClPlacemark,但您将能够访问其组件,或者至少访问一次您为其创建属性的组件。我希望这是有帮助的,并且非常清楚。可转换属性作为NSData保存在核心数据中。因此,fetch请求只会看到NSData的blob,并且在从核心数据检索NSData之前,不会将其转换回CLPlacemark。换句话说,fetch请求将无法查看CLPlacemark的组件,因为它已转换为NSData以存储在核心数据中。而且,由于谓词尝试访问
局部性
,并且核心数据中不存在
局部性
,因此它会崩溃。。。我也不明白如果我使用:NSPredicate*谓词=[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject,NSDictionary*绑定){Place*Place=(Place*)evaluatedObject;return[Place.placemark.Location IsequalString:_city];};创建getter不起作用。要按现有方式编写谓词,Placemark必须是一个实体,locality必须是一个核心数据属性。看看您的核心数据模型。如果在对象图中未看到
局部性
,则无法编写引用
局部性
的获取谓词。最简单的方法是在编写任何获取谓词之前查看核心数据模型(.xcdatamodeld文件)。如果它不在模型中,就不能在谓词中写入它。