3

我正在尝试使用谓词来获取要搜索的数据位于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

更新:我已经找到了如何通过在 CoreData 中使用 predicateWithFormat 来检查对象是否在对象的 NSSet 中?这可能会解决发布的问题,但我已经简化了一点。

我实际上拥有的是另一个实体,其中包含我正在搜索的大量详细信息,然后与我的“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 与类别的多对多关系对其进行过滤。

4

1 回答 1

5

要查找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];
于 2013-06-10T07:31:07.473 回答