5

Core Data で使用できないことを発見するためだけに慎重に作成したブロック述語があります。

NSPredicate *rootContactPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

        BOOL isPersonAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Person"] && [[(Person*)evaluatedObject accounts] count] == 0);
        BOOL isAccountAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Account"] && [(Account*)evaluatedObject root] == nil);

        return isPersonAndRoot || isAccountAndRoot;
    }];

したがって、これを標準の文字列形式の述語に変換する必要がありますが、評価されたオブジェクトのエンティティ タイプを確認する方法がわかりません。Personおよびエンティティは、フェッチ要求で評価される型であるエンティティのAccountサブクラスです。Contactサブタイプが表示されることを願っています。

4

3 に答える 3

2

管理対象オブジェクトのエンティティを値として指定して、述語でエンティティを単純に比較できるようになりました。

"entity = %@"

以前:

できません。その理由は、基礎となるデータ ストア (おそらく SQLite) で実行できるように、述語を変換する必要があるためです。SQLite データベースには、要素の型に関するデータはありません。オブジェクトのキーと値についてのみ知っています。

何をしようとしているかに応じて、スーパー エンティティで認識されているキーに対して単一のフェッチ リクエストを実行する必要があります。または、2 つのフェッチ リクエストを個別に実行してから、2 つの結果セットを結合する必要があります。

于 2013-05-03T15:37:08.803 に答える