2016-04-05 6 views
2

フォローシステムのコアデータスキーマ次のようにただ一つのテーブルを使用しています:のiOS:私は、MySQLとPHPでフォローシステムを持っている

ID |ユーザーIDは|

をfollowerid(もありますユーザテーブル:id |ユーザ名|パス)

ユーザが別のユーザの後に来るたびに、followカラムのfolloweridとuseridカラムに従うユーザが入力されます。

私は現在、Webサービスを使用してiOSアプリケーションからこれにアクセスしようとしています。

VCについては、ユーザーのフォロー者とユーザーがフォローしているユーザーとの間でNSPredicateを切り替えることで、ユーザーを一覧表示できるようにしたいと考えています。これはphp/sqlを使用するのは簡単ですが、CoreDataに翻訳する時間があることがあります。

今、私は次の属性を持つコアデータにおけるユーザーのエンティティを持っている:|ユーザ名|

idは

とMySQLスキーマのコピーを渡し、私はまた、FID以下のエンティティ を持っている| fuserid |

をffolowerid

私は、あるユーザ(例えば、ユーザ)がフォロワーを多く持ち、多くの人にフォローすることができるように、フォロワーと一対多関係。

Webサービスは、現在、次の行 ID沿っフォロワIDのセットをユーザに提供するように設定され、各ユーザのためのものである:私はこの時点で2,3,4-

:1 名:ボブ followeridsを困っている。ユーザーエンティティにデータを設定できます。フォロワーエンティティには、ユーザーに続くすべてのユーザーと、ユーザーが従うすべてのユーザーを入力することもできます。

しかし、どのフォロワーがどのユーザーに関連しているのかわかりませんし、たとえば、ユーザーのフォロワーをプルするなどの述部を書く方法もわかりません。

ご意見をお寄せいただきありがとうございます。

は今のところ私のNSManagedObjectsは次のようになります。

//User.h 
    #import "Following.h" 
    @class Following; 

    @interface User : NSManagedObject 
    //in user entity 
    @property (nonatomic, retain) NSNumber * uid; 
    @property (nonatomic, retain) NSString * uname; 
    @property (nonatomic, retain) NSString *upass; 

    //this is relationship 
    @property (nonatomic, retain) Following *following; 

    @end 

//and Following.h 
    #import "User.h" 
    @class User; 

    @interface Following : NSManagedObject 

    @property (nonatomic, retain) NSNumber * fid; 
    @property (nonatomic, retain) NSNumber * fuserid; 
    @property (nonatomic, retain) NSNumber * followerid; 
    //this is relationship 
    @property (nonatomic) User *user; 

    @end 

インポートおよびWebサービスからユーザーを保存した後、私は、エンティティは次のフォロワーに関するいくつかの情報を保存しようとするが、私はここでやっているかわかりません。.. ..

NSSet*followerids = importUser.followerids; 
        NSInteger *folnum =[followerids count]; 
        if (folnum>0) { 
        for (id item in followerids) { 
         Following *newFollowing = [NSEntityDescription insertNewObjectForEntityForName:@"Following" inManagedObjectContext:self.managedObjectContext]; 
         newFollowing.fuserid = useridnum; 
         NSNumber *itemnum = [NSNumber numberWithInt:[item intValue]]; 
         newFollowing.followerid = itemnum; 
         newFollowing.user = record; //where record is a user just created  
        } 
+0

を使用あなたは保管しようとしています。バックエンドシステムに存在するすべてのユーザーと関係をコアデータに格納しようとしていますか?または、アプリのユーザーの関係のみ? –

+0

かなりの数のユーザーが、20人ほどのユーザーを推奨しているため、アプリユーザーはそのユーザーにフォローできます。しかし、関係に従う限り、アプリユーザーが現在従っているユーザーまたは現在アプリユーザーに従っているユーザーだけです。 – zztop

答えて

1

あなたが効果的に多くの多の関係を持っている(各Userは、他の多くのUsersに従うことができ、多くのUsersを続けることができます)。 2つの対多関係、followedByUsersおよびusersBeingFollowedを1つを逆にして、追加のエンティティを作成せずにCoreDataで直接モデル化できます。結果として得られるモデルは次のようになります。

DataModel

あなたUserクラス定義は、このようになります。

@interface User : NSManagedObject 
//in user entity 
@property (nonatomic, retain) NSNumber *uid; 
@property (nonatomic, retain) NSString *uname; 
@property (nonatomic, retain) NSString *upass; 

//this is relationship 
@property (nonatomic, retain) NSSet *followedByUsers; 
@property (nonatomic, retain) NSSet *usersBeingFollowed; 

@end 

Webサービスがuseridname、およびセットのを提供している場合followeridsの場合、最初にUsersを作成し、関係を設定せずにループし、Userのレコードをフェッチして関係を確立します:

givenUser.followedByUsers 

それともしたい場合:

NSPredicate *userPredicate = [NSPredicate predicateWithFormat:@"uid == %@",importUser.userid]; 
NSFetchRequest *fetchUser = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 
fetchUser.predicate = userPredicate; 
NSArray *results = [context executeFetchRequest:fetchUser error:nil]; 
User *record = results[0]; 
NSSet *followerids = importUser.followerids; 
NSInteger folnum =[followerids count]; 
if (folnum>0) { 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uid IN %@",followerids]; 
    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 
    fetch.predicate = predicate; 
    NSArray *resultsArray = [context executeFetchRequest:fetch error:nil]; 
    if ([results count] > 0) { 
     NSSet *followers = [NSSet setWithArray:resultsArray]; 
     record.followedByUsers = followers; 
    } 
} 

は(簡単にするために、私は通常のエラーチェックを省略しました)関係を築いた、ユーザーがで指定されたユーザーを追跡するかを決定することができます述部を使用してください(例:使用)fetchedResultsControllerについて:逆に

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"usersBeingFollowed CONTAINS %@",givenUser]; 

givenUserは以下であることをユーザーを取得するため、私はどのユーザーとの関係はほとんど不明確だ

givenUser.usersBeingFollowed 

または

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"followedByUsers CONTAINS %@",givenUser]; 
+0

私はそれを取る最初の4つのステートメントは、正しい記録を取得することです。今は、以下のように、レコードを作成して保存した直後にこれを実行しています。NSEntityDescription * entity = [NSEntityDescription entityForName:@ "User" inManagedObjectContext:self.managedObjectContext]; //レコードを初期化する NSManagedObject * record = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; – zztop

+0

しかし、私はユーザーの後続のByUsersプロパティを追加しました。h、それは私にエラーが発生している 'プロパティは、NSManagedObject – zztop

+0

@zztopのオブジェクトには見つかりませんでしたusers' record = [[User alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; ' 'は' NSManagedObject'の 'User'サブクラスです。 – pbasdf

0

ここで関係に問題があります。あなたの説明に基づいて、ここに多対多の関係があるはずです。

だからあなたのUserクラスは

//this is relationship 
    @property (nonatomic, retain) NSSet *following; 

のような性質を持っている必要がありますそして、あなたの次のクラスが

@property (nonatomic) NSSet *users; 

のような性質を持っている必要があります次に、あなたはあなたがそれに追従IDのセットを割り当てる開始することができますウェブサービスから受信します。

関連する問題