Coredata获取NSSet的谓词

Sub*_*ash 2 core-data objective-c nsset nspredicate ios

我有一个ManagedPhoto coredata对象,它包含一个名为tags的NSSet属性.标记集中的每个对象都是NSString.

我需要获取所有具有特定值标签的ManagedPhoto对象,比如'party'.这就是我正在做的 -

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"ManagedPhoto"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF.tags == 'party'"];
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
Run Code Online (Sandbox Code Playgroud)

但是我总是得到一个空的结果数组,即使我确定有ManagedPhotos标签包含'party'.我也尝试过这个 -

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF.tags IN %@", @[@"party"]];
Run Code Online (Sandbox Code Playgroud)

我也尝试了很多其他的东西,但到目前为止还没有任何工作!任何想法?

Mar*_*n R 6

要获取至少具有指定值的一个标记的对象,以下谓词应该起作用

[NSPredicate predicateWithFormat:@"ANY tags == 'party'"]
Run Code Online (Sandbox Code Playgroud)

或更好

[NSPredicate predicateWithFormat:@"ANY tags == %@", @"party"]
Run Code Online (Sandbox Code Playgroud)

但我假设该集合被定义为可转换属性,这意味着它被存储为SQLite文件中的二进制存档.然后,上述查询最多可用于已加载到托管对象上下文中的对象,但不适用于存储文件.

您可能应该定义tags为具有String属性(例如"name")的另一个实体的to-many关系,然后使用谓词进行查询

[NSPredicate predicateWithFormat:@"ANY tags.name == %@", @"party"]
Run Code Online (Sandbox Code Playgroud)