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ですか?

更新:それ以来、このHow to check if an objects is inside a NSSet of objects by using predicateWithFormat in CoreData? を見つけました。それはおそらく投稿された質問を解決するでしょうが、私はこれを少し単純化しすぎました。

私が実際に持っているのは、私が検索している詳細の山全体を持つ別のエンティティであり、それは私の「MyEntity」エンティティと多対1の関係にあります。

MySearchEntity:

@property (nonatomic, retain) NSNumber *searchField1;
@property (nonatomic, retain) NSNumber *searchField2;
@property (nonatomic, retain) MyEntity *myEntity;
@property (nonatomic, retain) NSNumber *id;

そして、このようなフェッチリクエスト

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オブジェクトが特定のセットに少なくとも 1 つのカテゴリを持つオブジェクトを見つけるには、次の述語を使用します。

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 に答える