0

私は2つのモデル間に1対多の関係があります。user <-->> followersフォロワーテーブルはuserIdsで構成されています。関連するユーザーをこれらのユーザーに取得するためにフェッチリクエストを作成したいと思いますuserId。私の述語は現在次のようになっています:

predicate = [NSPredicate predicateWithFormat:@"ANY userId IN %@", self.user.followers];

これにより、結果は0になります。この述語はどのように見えるべきでしょうか?

アップデート

フォロワーオブジェクトをユーザーに追加するために使用するコード(JSONデータから):

+ (void)insertFollowersFromDict:(NSDictionary *)dictionary forUser:(User *)user  inManagedObjectContext:(NSManagedObjectContext*)moc
{
    NSArray *followers = [dictionary objectForKey:@"data"];

    if (followers.count != 0) {
        NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Follower" inManagedObjectContext:moc];
        for (NSString *followerId in followers) {
            Follower *newFollower = [[Follower alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:moc];
            NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];
            newFollower.user = [User findUser:[numberFormatter  numberFromString:followingId] inManagedObjectContext:moc];
            [user addFollowersObject:newFollower];
        }
    }
}

テーブルビューでセルを構成するために使用するコード:

// This for some reason always result in the same user. 
Follower *follower = [self.fetchedResultsController objectAtIndexPath:indexPath];
User *cellUser = follower.user;

// Always self.user
cell.text = cellUser.name

------------------------
I Anders               I
------------------------
------------------------
I Anders               I 
------------------------

なぜこれが起こるのかわかりません。

4

2 に答える 2

3

アンダース、

アプリを動作させるのに適していると思われるモデルについて、いくつかの詳細を提供しようと思います。

まず、モデルは次のようになります (ご覧のとおり、属性は省略しています)。

ここに画像の説明を入力

anUserは、0 個または多数の s にリンクされていますFollower

関係について話し合ってください。

followersFollowerエンティティとの対多関係です。このように設定されています。

ここに画像の説明を入力

ご覧のとおり、ユーザーはフォロワーを持つことができないため、rel はオプションです。ユーザーを削除すると、そのフォロワーも削除されるため、削除ルールはカスケードです。

userそれどころか、ユーザーとの関係は 1 対 1 です。このように見えます。

ここに画像の説明を入力

フォロワーはユーザーとのみ存在できるため、オプションではありません。フォロワーを削除すると、その変更は関連付けられたユーザーに影響を与えないため、無効化されます。

:提供された仕様に基づいてモデルを作成しましたが、多対多の関係に合わせて拡張することもできると思います。つまり、異なるユーザーが同じフォロワーを持つことができます。

これで、 に対してフェッチ リクエストを作成するFollowerと、次の方法で特定のユーザーに属するすべてのフォロワーを取得できます。

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Follower"]
[request setPredicate:[NSPredicate predicateWithFormat:@"user == %@", self.user]];
NSArray* results = // execute the request here

// results will contain the followers for a specific user (i.e. the one you used in the predicate)

それが役立つことを願っています。

編集

NSManagedObject* follower = [followerResults objectAtIndex:[indexPath row]]; // this gives you a follower, put some error control if followerResults has no elements
NSManagedObject* user = [follower objectForKey:@"user"]; // this gives you the user associated to that follower

編集 2

私はあなたが何を意味するのか明確ではありませんが、あなたが使用しているので動作は正しいです

cell.text = cellUser.name

このようにして、ユーザーに関連付けられた名前を取得します。その一連のフォロワーに関連付けられているユーザーは 1 人だけです。

たとえば、ユーザー Andrew にはゼロまたは多数のフォロワー (Mike、Bob、Todd) がいます。

あなたが使用する取得リクエストは次のことを行います:ユーザーが Andrew であるすべてのフォロワーを私に渡してください。

フォロワーを表示したい場合は、次のように変更します

cell.text = follower.name; // if Follower entity has a name attribute

非常に重要

Followerエンティティに新しい属性 (関係ではない) を追加します。それnameを呼び出して、タイプにしNSStringます。あなたがUserエンティティに対して行ったように(私は思う)。

次に、新しいFollowerオブジェクトを作成するときに、次のように設定します

 newFollower.user = // set the user
 newFollower.name = // set the name

ATTRIBUTESRELATIONSHIPSの違いを理解することを強くお勧めします。

前者は、特定のエンティティ (名前、年齢、性別など) のプロパティです。後者はエンティティ間のリンクです。

于 2013-02-23T11:59:53.200 に答える
3

オブジェクト間の関係が必要です。userIDFollowerオブジェクトに格納する必要はありません。このようにして、次のように簡単に書くことができます。

predicate = [NSPredicate predicateWithFormat:@"user = %@", self.user];

Followersこれにより、 と関係のあるすべての が返されself.userます。お役に立てれば。

于 2013-02-19T21:18:03.300 に答える