9

写真のデータベースを持つアプリケーションを作成しています。各写真にはいくつかのタグが関連付けられており、アプリケーションには多くのトグルを備えた検索ページがあり、ユーザーは関心のあるタグのみに基づいて写真を検索できます。これらのタグはそれぞれ、外部データベースの ID に対応する整数ID を格納しているため、単純に ID で検索しようとしています。 ID フィールドはすべて索引付けされています。

私が書いている述語が非常に大きくなると、問題が発生します。これは、ユーザーがさまざまなタグからフィルターを選択できるためです。これらのタグは 3 つのカテゴリ [出版物、ブランド、製品] にグループ化されているため、クエリはカテゴリ内で「OR」され、これらのカテゴリ間で「AND」されるように設定されています。

クエリ述語の例は、最終的に次のようになります。

(parentPublication.publicationId==1 OR parentPublication.publicationId==2 OR parentPublication.publicationId==5) 
AND (ANY brands.brandId==12 OR ANY brands.brandId==2 OR ANY brands.brandId==0 OR ANY brands.brandId==3 OR ANY brands.brandId==5 OR ANY brands.brandId==6 OR ANY brands.brandId==7) 
AND (ANY products.productId==2 OR ANY products.productId==3 OR ANY products.productId==6)

それらははるかに大きくなる可能性がありますが、要点はわかります。私の問題は、これらすべてが高価な結合を実行しているため、ユーザーが 10 または 15 以上を選択すると、クエリの実行時間が非常に長くなり、アプリがクラッシュすることさえあります。

以下のように書くと効率が良さそうです。

parentPublication.publicationId IN (1,2,5) 
AND (ANY brands.brandId IN (12,2,0,3,5,6,7))
AND (ANY products.productId IN (2,3,6))

しかし、その構文を機能させることができないようです。

だから私の質問は: このタイプの構文はサポートされていますか? もしそうなら、誰かがそれを正しく書く方法を教えてもらえますか?

それとも、コア データに対してこの種のクエリをまとめてアプローチするためのより良い方法はありますか?

4

1 に答える 1

16

次のようなコレクション述語を使用します

[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs];
[NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs];
[NSPredicate predicateWithFormat:@"product.productID in %@", productIDs];

これで、属性の 3 つの配列を保持し、 で 3 方向の複合述語を作成するだけで済みますandPredicateWithSubpredicates

[NSCompoundPredicate andPredicateWithSubPredicates:@[
   pubPredicate, brandPredicate, productPredicate]];

OK を実行する必要があります。

于 2013-08-09T23:29:34.560 に答える