1

NSPredicate を作成して SQL のようにする方法を知っています"SELECT * FROM DRINK"。しかし、次のクエリはどうでしょうか。

"SELECT I.name, D_I.amount 
FROM DRINK_INGREDIENT D_I, DRINK, INGREDIENT I 
WHERE D_I.drinkID=1 AND DRINK.drinkID=1 AND I.ingredientID = D_I.ingredientID;"  

この種のクエリに対して NSEntityDescription と NSPredicate を設定するにはどうすればよいですか?

4

1 に答える 1

5

通常、Core Data では、ニーズを満たすデータ モデルを設計して使用します。SQL の観点から考える必要はありません。ストレージに SQL を使用する必要さえありません。また、述語などを使用して SQL クエリをフェッチ要求に直接変換しようとするべきでもありません。

そうは言っても、述語を作成するときに SQL WHERE 句の観点から考えると役立つ場合がありますが、実際のフェッチ リクエストは、どのエンティティを取得する必要があるか、コレクションをどのようにフィルタリングおよび/またはソートする必要があるかなどに帰着します。

フェッチ リクエストは 1 つのエンティティに限定されるため、クエリをシミュレートするには複数のフェッチ リクエストが必要になると思います。

Core Data データ モデルはどのように見えますか? 何を達成しようとしていますか?これまでに何を試しましたか?

UPDATE
あなたのデータモデルには2つのエンティティが含まれているようです.DrinkとIngredientで、それらの間に多対多の関係があります:

飲み物 <<-->> 成分

Core Data では、明示的に作成しない限り、DrinkIngredient エンティティは存在しないことに注意してください (多対多の関係用に追加のテーブルがありますが、抽象化されています)。追加テーブルの行に関連付けられた金額値が必要なため、Core Data に DrinkIngredient エンティティを追加することをお勧めします。

飲み物 <-->> 飲み物の成分 <<--> 成分

注: DrinkIngredient には、厳密に 1 つの Drink と 1 つの Ingredient があります。ドリンクは多くの DrinkIngredients を持つことができ、Ingredients は多くの DrinkIngredients で使用できます。

特定の飲み物の成分リストの名前と量を取得したいようです。これを行うには、次のようなフィルター述語を使用して DrinkIngredient オブジェクトをフェッチするだけです。

// assuming "aDrink" is a reference to a particular Drink object
// and "drink" is the relationship from DrinkIngredient to Drink
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"drink == %@",aDrink];

// if the fetch request result array is named "ingredientList"
// and the relationship from DrinkIngredient to Ingredient is "ingredient"
for (DrinkIngredient *di in ingredientList) {
    NSString *ingredientName = di.ingredient.name;
    NSUInteger amount = di.amount.integerValue;

    // use "ingredientName" and "amount" here
}

SQL ではなく Core Data を使用しているため、やり方が異なります。たとえば、すべての飲み物の名前と量を含む成分リストを表示する場合は、単純にすべての Drink オブジェクトを取得し (フィルター述語なし)、Drink から DrinkIngredient への関係を介して成分にアクセスします。

繰り返しになりますが、何を達成しようとしているのかを考え、データ モデルを適切に設計して使用する必要があります。SQL やクエリについて考える必要はありません。

于 2010-02-11T08:27:54.430 に答える