9

サブクエリを使用してこれに対する解決策を思いつきましたが、最初にやろうとしていたことがうまくいかなかった理由がわかりません。

これが私のデータモデルです。私はアドバイスを取得しています。

ここに画像の説明を入力

述語として次のことができます。

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];

これは正常に機能し、その条件の少なくとも 1 つがその地形タイプを持っている場合にアドバイスを返します。

ただし、これを実行しようとすると失敗します。

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];

私がやりたいことは、条件の少なくとも 1 つに地形タイプが設定されていないアドバイスを返すことです。

ただし、以下は機能します。

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil).@count > 0"];

ANYnil を検索するときに構文を使用できない理由を誰かが説明できますか?

4

2 に答える 2

26

nil を検索するときに ANY 構文を使用できない理由を誰か説明できますか?

うん!これが何が起こっているかです。

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];

まず、これを適切な左式と右式に分解しましょう。

conditions.terrain

これは、SELFオブジェクト (Adviceインスタンス) を取得し、valueForKeyPath:@"conditions.terrain". このキーパスの結果はコレクションになります。あなたは本質的にやっています:

Advice *a = ...;
NSSet *conditions = [a conditions];
NSSet *terrains = [conditions valueForKey:@"terrain"];

したがって、(潜在的な)Terrainインスタンスのコレクションがあります。では、Objective-C のコレクションについて何を知っているでしょうか? 1 つには、それらに を含めることはできませんnil。オブジェクトのみを含めることができます。これはANY、述語の部分を実行するときに、配列内のアイテムを反復処理し、それらのどれも ではないことを確認することを意味しますnil

したがって、述語は失敗しています。他のバリエーション( の[NSNull null]代わりに使用するnilなど)を試してみましたが、どれもうまくいかないようでした。

したがって、SUBQUERYこれを解決するために a を使用することは、得られるものとほぼ同じであるように思われます。あなたの期待を詳述し、これがうまくいくはずだと思う理由を説明して、バグを報告することを強くお勧めします。

于 2012-11-02T17:56:38.130 に答える
0

nilクエリでは使用できないと思います。NULLまたはのようなフォーマット文字列構造を 使用する必要があります"ANY conditions.terrain == %@", nil

私を困惑させるのは、あなたのサブクエリが機能していることです...

とは同じ意味で使用できるため、上記は正しくありませんNULLNIL

代わりに、NSExpression Class Reference@countは、好ましい例として正確にあなたのパターン (with ) を提供します。

地形関係がオプションであることを確認しましたか?

于 2012-11-02T11:14:29.260 に答える