13

iOS で Core Data Model を実装する方法を学び始めたところです。エンティティ間の 1 対 1 の関係でデータを保存および取得する方法に関するいくつかの基本的なチュートリアルの後、私は今、1 対多の関係を実装しようとしています。私のデータ モデルは、次のように定義されたそれぞれのクラスを持つ 2 つのエンティティで構成されます。

Restaurant:
@interface Restaurant :NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSMutableArray *user_reviews;   /* One to Many Relation to Review Entity*/
@end

Review:
@interface Review : NSObject
@property (nonatomic, strong) NSString *rating;
@property (nonatomic, strong) NSString *review_text;
@property (nonatomic, strong) User *user;
@end

NSMutableSet を使用して挿入する同様の質問を見つけましたが、NSMutable Array に同じものを実装することはできません。

現在、挿入コードは次のようになっています。

NSManagedObjectContext *context = [self managedObjectContext];
Restaurant *rest = [NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:context];
rest.name = restaurant.name;

JSON 経由でレストランとそのレビューのデータを取得し、CORE データベースに保存する前に一時クラスに保存します。One to Many Relationship を持つデータを挿入するにはどうすればよいですか?

EDIT:現在、user_reviewプロパティを次のように定義するクラスの形式でデータを受け取ります

NSMutableArray *user_reviews;

この同じクラスを実装して、コア データ モデルに挿入しようとしています。ただし、コア データ モデルは NSMutableArray の代わりに NSSet を使用します。強引なアプローチの 1 つは、NSMutableArray を使用する代わりに、同じプロパティを持つすべてのクラスを複製することです。NSSet に変更します。しかし、これにより膨大な量の冗長コードが作成されます。これを行うためのより効率的な方法があるべきではありませんか?

4

2 に答える 2

21

Review が coreDataModel のリレーションシップになる場合は、代わりに を使用NSMutableArrayNSSetて Restaurant Entity に接続してください。

レビュー中: ここに画像の説明を入力

レストランで: ここに画像の説明を入力

xcode にクラスを生成させると、次のようになります。

Restaurant:
@interface Restaurant : NSManagedObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSSet *user_reviews;   /* One to Many Relation to Review Entity*/

@interface Restaurant(CoreDataGeneratedAccessors)

- (void)addUser_reviewsObject:(Review *)value;
- (void)removeUser_reviewsObject:(Review *)value;
- (void)addUser_reviews:(NSSet *)value;
- (void)removeUser_reviews:(NSSet *)value;

@end

Review:
@interface Review : NSManagedObject
@property (nonatomic, strong) NSString *rating;
@property (nonatomic, strong) NSString *review_text;
@property (nonatomic, strong) User *user;
@property (nonatomic, strong) Restaurant *restaurant;
@end

あなたの電話は次のとおりです。

NSManagedObjectContext *context = [self managedObjectContext];
Restaurant *rest = [NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:context];
rest.name = restaurant.name;

Review *rev = [NSEntityDescription insertNewObjectForEntityForName:@"Review" inManagedObjectContext:context];
rev.rating = @"1";
rev.review_text = @"nomnomnom";

[rest addUser_reviewsObject:rev];
// or rev.restaurant = restaurant; one of both is enought as far as I remember

// save your context

編集

でなければならないとすればNSMutableArray、それは合理化することはできません。
それらは常にNSSets(x から n の場合) または宛先クラスです。を使用NSMutableArrayすると、セットと自動処理の利点が得られます。

しかし、本当に に保存したい場合は、少なくとも属性 (一意) でクラスNSMutableArrayを展開し、.ReviewreviewIDNSMutableArrayTransformable

//Review:

@interface Review : NSManagedObject
@property (nonatomic, strong) NSString *rating;
@property (nonatomic, strong) NSString *review_text;
@property (nonatomic, strong) User *user;
@property (nonatomic, strong) NSNumber *reviewID;
@end

//Restaurant.h:

@interface Restaurant : NSManagedObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSSet *user_reviews; // Set of NSNumbers

- (void)addUser_reviewsObject:(Review *)value;
- (void)addUser_reviewsID:(NSNumber *)value;
- (void)removeUser_reviewsObject:(Review *)value;
- (void)addUser_reviews:(NSMutableArray *)value;
- (void)removeUser_reviews:(NSMutableArray *)value;

@end

//Restaurant.m:

- (void)addUser_reviewsObject:(Review *)value
{
    [self addUser_reviewsID:value.reviewID];
}

- (void)addUser_reviewsID:(NSNumber *)value
{
    if(![self.user_reviews containsObject:value];
        [self.user_reviews addObject:value];
}

- (void)removeUser_reviewsObject:(NSNumber *)value
{
    // follow upper logic and implement yourself
}

- (void)addUser_reviews:(NSMutableArray *)value
{
    // follow upper logic and implement yourself
}

- (void)removeUser_reviews:(NSMutableArray *)value
{
    // follow upper logic and implement yourself
}
于 2013-06-10T07:28:58.743 に答える
1
Review *review = (Review *)[NSEntityDescription insertNewObjectForEntityForName:@"Review" inManagedObjectContext:[self managedObjectContext]];
review.review_text = @"test text";
//set other properties if needed

rest.user_reviews = [NSSet setWithObjects:review, nil];//just make NSSet for you reviews
于 2013-06-10T07:21:05.773 に答える