2

私は他の質問を見て、答えを垣間見ましたが、どれもうまくいきませんでした.

これが私の状況です。「Menu」と「Restaurant」の 2 つのオブジェクトがあります。Menu にはすべてのメニュー項目があり、「Restaurant」はさまざまなレストランの名前です。したがって:

メニュー オブジェクト - menuId - name - protein - restaurantID (1 対 1)

レストラン オブジェクト - restaurantID (1 対多) - 名前

ユーザーがレストラン名を教えてくれたら、メニュー項目を返したいと思います。SQL では、次のようになります。

SELECT * FROM ZMENU WHERE zrestaurantId = (SELECT Z_PK FROM ZRESTAURANT WHERE zname="Starbucks")

私は試した

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Restaurant"];
[request setEntity:e];
*NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(restaurant = (SUBQUERY(Restaurant, $x, $x.name like[cd] %@).@count))", restaurantName];

しかし、私はエラーが発生します

'NSInvalidArgumentException', reason: 'Unable to generate SQL for predicate (restaurant == SUBQUERY(Restaurant, $x, $x.name LIKE[cd] "Starbucks").@count) (problem on RHS)'

誰か助けてくれませんか?2 つのフェッチ (レストラン PK 用とメニュー項目用) を行う必要がないようにしたいので、もっと適切な解決策が必要だと思います。

4

1 に答える 1

0

わかった!!!!!

要素の作成は正しく、サブクエリを次のように変更するだけです

NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Menu"]; [request setEntity:e];

NSString restaurantName = @"スターバックス";

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(restaurantId, $x, $x.name == %@).@count != 0", restaurantName];

したがって、サブクエリの仕組みは、エンティティを設定することにより、取得するオブジェクト (テーブルで選択) を確立することです。次に、述語で、外部テーブルを参照するフィールドでサブクエリを使用します。次に、チェックしたいテーブルのフィールドを指定します。それだけです。「カウント」がある理由はわかりませんが、機能します。

ちなみに、ドキュメントごとに、サブクエリ内では、チェックしたい int または文字列値に %@ を使用でき、チェックしたいフィールド名に %K を使用できます。かなりクール!:-D

于 2012-12-14T04:34:38.520 に答える