1

コアデータモデルの親エンティティと子エンティティに小さな問題があります。私のコアデータモデルには、多くのgoogleplusアカウントまたはTwitterアカウントをリンクできるPersonエンティティがあります。これらの2つのエンティティ以来; GooglePlusとTwitterは、それらが持っているプロパティとどういうわけか似ています。私は、SocialConnectionと呼ばれる抽象的なエンティティを作成することを考えました。これで、私のPersonエンティティはSocialConnectionエンティティと多くの関係を持ち、SocialConnectionエンティティはGooglePlusとTwitterの両方の親になります。

Person  <----->> SocialIdentifier ---- Child ---- GooglePlus
                     |
                     |
                   Child
                     |
                     |
                  Twitter

私のグラフィカルモデルを次の図に示します。

ここに画像の説明を入力してください

今、私はここに状況があります。Personには、TwitterオブジェクトであるかGooglePlusオブジェクトであるかに関係なく、すべての接続をフェッチするsocialConnectionsというプロパティがあります。でも、いつかツイッターとグーグルプラスだけをフェッチしたいです。どうすればいいですか。

1つのアイデアは、Personエンティティを指すSocialIdentifierからの後方関係を持ち、Personに各子との前方関係を作成させることだと思います。

それは次のように表されます。

Person  <----------- SocialIdentifier -------- Child --------GooglePlus----->> Person
                              |
                              |
                            Child
                              |
                              |
          Person  <<------- Twitter

グラフ表示; ここに画像の説明を入力してください

しかし、この表現でも、私はいくつかの問題に直面しています。Personモデルからグーグルとツイッターを取得できましたが、SocialConnectionsへの参照がありません。すべての接続。そして、最初のものは設計を大幅に簡素化するので、これは冗長だと思います。最初のものを少し微調整することで目的の結果が得られると確信していますが、それを理解することはできませんでした。

どうすれば最初のモデルから直接twitterまたはgoogleをフェッチできますか、または述語ofcourseを使用せずにPersonモデルからすべての接続をフェッチすることは可能ですか。これにはかなりきちんとした解決策があると確信しています。よろしくお願いします。

4

1 に答える 1

3

私はこれのために新しい関係を築くつもりはありません。いくつかの異なるアプローチを使用できます。

取得したプロパティ

Personという名前の新しいフェッチされたプロパティを指定しますtwitters。宛先エンティティをTwitterに、フェッチ述語を に設定しperson==$FETCH_SOURCEます。次に、twitters必要なときに値を尋ねます。(ええ、何らかの理由で述語がないと言いましたが、正直なところ、ここでの仕事に適したツールです)。

ここでの利点は、新しい関係を維持する必要がないことです。新しい Twitter アカウントを に追加するとsocialConnections、自動的に の一部になりtwittersます。

セットのフィルタリング

数が多くない場合はsocialConnections、Core Data にそれをさせる代わりに、コードでフィルタリングする方が簡単かもしれません。すべてsocialConnectionsのオブジェクトを取得し、セットを次のようにフィルタリングします。

NSEntityDescription *twitterEntity = [NSEntityDescription entityForName:@"Twitter" inManagedObjectContext:[self managedObjectContext]];

NSSet *twitters = [[person valueForKey:@"socialConnections"] objectsPassingTest:^BOOL(id obj, BOOL *stop) {
    return [[obj entity] isKindOfEntity:twitterEntity];
}];

これはすべてのソーシャル コネクションを通じて実行され、Twitter アカウントだけを取得します。

于 2013-01-15T23:38:21.910 に答える