1

名前やタイプなどの属性を持つコア データ クラス SSSLicense があります。これは、isArchived という名前のブール属性を持つ SSSArchivableEntity と呼ばれる抽象エンティティから継承します。

DB からライセンス エンティティの完全なセットを既にフェッチしており、現在、タイプと isArchived フラグに基づいてフィルタリングしようとしています。しかし、述語のさまざまなバリエーションにもかかわらず、有効な結果を得ることができません。

関連するコードは次のとおりです。

    NSSet *licenses = [person licenseList] ;

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(licenseType like %@) AND (isArchived == NO)",
                           lType];
NSSet *filteredLicenses = [licenses filteredSetUsingPredicate:predicate];

SSSLicense の別の属性 (isArchived の代わりに name など) を使用するように述語を変更すると、述語は機能します。SSSLicense に単純なブール属性を追加し、それを使用して正常にフィルタリングしました。

isArchived が抽象エンティティの属性であることが関係しているようです。継承された属性でフィルタリングするために何か特別なことをする必要がありますか?

ありがとう!

4

3 に答える 3

0

問題は、述語が if ステートメントを介して条件付きテストと直接テストをテストする方法の 1 つであることが判明しました。私のシードデータは、直接セッター呼び出しを介してライセンスを作成しましたが、明示的に isArchived を NO に設定していませんでした。アプリ内では、ライセンスが作成されたときに設定されていました。そのため、述語を介してシード データが返されませんでした。ただし、セットを手動でループし、「[license isArchived] == NO」を介してテストを実行すると、シード データとアプリ データの両方が期待どおりに返されました。

私の推測では、直接のブール値テストは有効な 'YES' をチェックし、そうでない場合は NO を想定していますが、述語は明示的に YES=1 NO=0 をチェックしています (またはそれが表現されています)。

于 2013-06-24T16:04:47.460 に答える
0

値のハードコーディングが機能しない可能性があります。標準の構文を使用することをお勧めします。

[NSPredicate predicateWithFormat:
    @"(licenseType like %@) && (isArchived = %@)", lType, @(NO)];

これが機能しない場合は、コマンド ライン ツールまたは Firefox の SQLite Manager プラグインを使用して、isArchivedプロパティの値を手動で確認します。sqlite3永続化されていない値が期待されている可能性があります。

これらすべてが検証された場合、述語は実際には機能しますが、間違った値を読み取ったり、間違った値を表示したりしている可能性があります。

于 2013-06-23T09:31:18.733 に答える