web-dev-qa-db-ja.com

複数のパラメーターを持つNSPredicate

こんにちは述語の助けが必要です。問題は、データベースからフェッチする1つの関数が、受け取る複数の値に依存することですが、値が常に存在するとは限りません。つまり、複数の異なる述語を作成する必要がありますか?

以下のコード

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND item_category LIKE %@ AND item_make LIKE %@ AND item_gender LIKE %@ || item_price>%@ || item_price<%@",
                              brand_one, brand_two, brand_three, brand_four, brand_five, categoryString, makeString, genderString,[NSNumber numberWithInt:price_bottom],[NSNumber numberWithInt:price_top]];

brand_one、brand_twoなどが存在する場合と存在しない場合があります。

たとえば、item_genderの場合はどうすればよいですか。両方を持つよりも性別が指定されていない場合を考えてみましょう。

問題の説明がわかりにくい場合は申し訳ありません。

Gobrasのコメントに基づいて、次のコードが生成されました

NSArray *brands = [NSArray arrayWithObjects:brand_one, brand_two, brand_three, brand_four, brand_five, nil];

    NSPredicate *predicate_brands = [NSPredicate predicateWithFormat:@"brand_id like %@" argumentArray:brands];

検索機能がどうあるべきかについての論理的説明

  1. fetchrequest
  2. フェッチ要求の述語

5つのブランドID、アイテムID、アイテムカテゴリ、アイテムメーカー、アイテムの性別に基づく述語。上記のいずれかが空の場合は、関連するすべてのエントリをフェッチする必要があります。たとえば、アイテムカテゴリが空の場合は、すべての「ジュエリー、時計など」をフェッチする必要があります。残りの述語式で制限します。

たとえば、ブランドの複合述語を作成し、「ジュエリーのようなitem_category」と「時計のようなitem_category」の値を持つアイテムカテゴリ用に別の述語を作成する必要があります。その後、それらを正確にまとめるにはどうすればよいですか。

24
Rouslan Karimov

個々の述語の適切なコレクションをNSCompoundPredicateにアセンブルします

のように

NSMutableArray *parr = [NSMutableArray array];
if([brand_one length]) { 
    [parr addObject:[NSPredicate predicateWithFormat:@"brand_id LIKE %@",myBrandId]];
}
if([brand_two length]) { 
     // etc 
}

NSPredicate *compoundpred = [NSCompoundPredicate andPredicateWithSubpredicates:parr];

orPredicateWithSubpredicates:andPredicateWithSubpredicates:を使用して述語を積み重ねることができ、NSPredicate自体であるNSCompoundPredicateを複合することができます。

https://developer.Apple.com/documentation/foundation/nscompoundpredicate を参照してください。

62
Warren Burton

Swiftに興味のある方へ!

let arrPred = [NSPredicate(format: "yourAttribute LIKE %@", toCompareID), NSPredicate(format: "yourAttribute2 LIKE %@", toCompareID2)] //Add as many predicates you want in short make your query

let compoundpred:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: arrPred)
var arrFiltered = yourArray.filteredArrayUsingPredicate(compoundpred)
2
Rein rPavi

述語を動的に構築するのは非常に簡単です。述語フォーマット文字列を必要な数の条件と組み合わせて、対応するNSMutableArrayを引数で構築します。 [NSPredicate predicateWithFormat:argumentArray:]残りを行います。

1
Gobra