我正在尝试使用谓词来获取我要搜索的数据位于 NSSet 中的数据

@property (nonatomic, retain) NSSet *categories;
@property (nonatomic, retain) NSString *otherDetails;
@property (nonatomic, retain) NSNumber *id;
NSSet 类别由另一个实体组成,包含:
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSNumber *id;

然后尝试通过谓词获取它
NSFetchRequest *fetcher =[NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
fetcher.predicate = [NSPredicate predicateWithFormat:@categories in  %@", catList];

其中 catList 是:
NSmutableArray *catList = [[NSMutableArray alloc] init];

并填充数据

然后这给了我以下错误
'NSInvalidArgumetException', reason: 'unimplemented SQL generation for predicate: (categories IN {"this", "that"});

我尝试将其更改为使用这样的 NSSet 字段
fetcher.predicate = [NSPredicate predicateWithFormat:@categories.name in  %@", catList];

但这没有用。

如果我更改谓词以使用 NSString 它不会出错,但由于数据不同,不会返回任何结果。
fetcher.predicate = [NSPredicate predicateWithFormat:@categories in  %@", catList];

那么我必须做什么才能使用谓词对 NSSet 进行查询?

更新:
从那以后,我发现这个 How to check if an objects is inside of a NSSet of objects by using predicateWithFormat in CoreData? 可能会解决所发布的问题,但我已经简化了太多。

我实际上拥有的是另一个实体,其中包含我正在搜索的一大堆细节,然后与我的“MyEntity”实体存在多对一关系。

我的搜索实体:
@property (nonatomic, retain) NSNumber *searchField1;
@property (nonatomic, retain) NSNumber *searchField2;
@property (nonatomic, retain) MyEntity *myEntity;
@property (nonatomic, retain) NSNumber *id;

和这样的 fetchrequest
NSFetchRequest *fetcher =[NSFetchRequest fetchRequestWithEntityName:@"MySearchEntity"];
fetcher.predicate = [NSPredicate predicateWithFormat:@"myEntity.otherDetails CONTAINS %@ && searchField1 <= %f && searchField2 >= %f && myEntity.categories.name in  %@", catList];

所以该语句的其余部分有效,但我仍然无法通过 MyEntities 与类别的多对多关系对其进行过滤。

最佳答案

要查找相关 MySearchEntity 对象在给定集合中至少具有一个类别的 MyEntity 对象,您可以使用谓词

NSArray *catList = array of Category objects;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myEntity.categories IN %@", catList];

或者,如果类别是按名称给出的:
NSArray *catList = array of NSString objects;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myEntity.categories.name IN %@", catList];

关于ios - 从实体具有 NSSet 的 coredata 中检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17015607/

10-12 05:41