Подтвердить что ты не робот

Основные данные: вставка в отношения "один ко многим"

Я только начал изучать, как реализовать Core Data Model на iOS. После некоторых базовых руководств по хранению и извлечению данных с одним отношением между объектами я теперь пытаюсь реализовать отношения от одного до многих. Моя модель данных состоит из двух объектов с их соответствующими классами, которые определены следующим образом:

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. Как вставить такие данные, которые имеют отношение "один к многим"?

ИЗМЕНИТЬ: В настоящее время я получаю данные в виде класса, который определяет свойство user_review как

NSMutableArray *user_reviews;

Я пытаюсь реализовать этот же класс для вставки в базовую модель данных. Но основная модель данных использует NSSet вместо NSMutableArray. Один грубый подход состоит в том, чтобы дублировать все классы с теми же свойствами, кроме как вместо NSMutableArray, я изменяю его на NSSet. Но это создает огромное количество избыточного кода. Не должен ли быть более эффективный способ сделать это?

4b9b3361

Ответ 1

если ваш обзор будет отношениями в вашем coreDataModel, используйте вместо NSMutableArray NSSet и подключите его к веб-узлу ресторана.

В обзоре: enter image description here

В ресторане: enter image description here

Если вы дадите 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, я рекомендую расширить ваш класс Review хотя бы на атрибут reviewID (уникальный) и сохранить NSMutableArray как Transformable.

//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
}

Ответ 2

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