2013-06-10 2 views
13

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 배열에 대해 동일한을 구현 드릴 수 없습니다. 내가 JSON을 통해 레스토랑 및 리뷰에 대한 데이터를 검색하고 코어 데이터베이스에 저장하기 전에 일시적 클래스에 저장

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

: 같은

현재 내 삽입 코드 보인다. 일대 다 관계가있는 데이터를 어떻게 삽입합니까?

는 편집 : 현재 내가 핵심 데이터 모델에 삽입이 같은 클래스를 구현하기 위해 노력하고

NSMutableArray *user_reviews; 

로 user_review 속성을 정의하는 클래스의 형태로 데이터를받을 수 있습니다. 그러나 핵심 데이터 모델은 NSMutableArray 대신 NSSet을 사용합니다. 짐작할 수있는 한 가지 방법은 NSMutableArray를 사용하는 대신 NSSet으로 변경하는 것을 제외하고는 동일한 속성으로 모든 클래스를 복제하는 것입니다. 그러나 엄청난 양의 중복 코드가 생성됩니다. 이 작업을 수행하는보다 효율적인 방법이 없어야합니까? 당신의 검토가 당신의 coreDataModel에 관계한다 경우

답변

20

, NSMutableArrayNSSet 대신 사용하고 레스토랑 엔티티와 연결하시기 바랍니다. 검토에서

: 레스토랑에서 enter image description here

: 당신은 엑스 코드는 당신의 클래스를 생성 할 경우 enter image description here

, 그것은 다음과 같을 것이다는 :

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에 저장하려면

는하지만, 적어도 reviewID 속성 (독특한)하여 Review 클래스를 확장하여 NSMutableArrayTransformable로를 저장하기 위해 운영자 추천.

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

이 부분에 코드를 복사/붙여 넣기 ^^ NSObjects가 아니고 NSManagedObjects가 있으면 문제가 있습니까? 이 솔루션에 반대하는 이유가 있다면 알려주십시오 :) – geo

+0

* "... 내가 생각한만큼 *"- Restaurant.user_reviews 및 Review.restaurant가 역 관계로 설정된 경우 * 올바른지 * *, 스크린 샷에 나와 있습니다. –

+0

문제가 있습니다. 먼저 RestKit 0.20을 사용하여 API에서 전체 데이터를 온라인으로로드합니다. Restkit은 모든 관계를 NSSet 대신 배열에로드합니다. Restkit에서 "Restaurant.h"클래스를 정의하여 데이터를로드/매핑합니다. 이제 데이터를 코어 데이터 모델로로드하여 저장하므로 오프라인 액세스가 가능합니다. 하지만 그렇게하려면 각 개체에 대한 클래스를 만들어야합니다. NSMutableArray와 NSSet을 제외한 모든 것이 동일하기 때문에 RestKit API를 위해 만든 클래스를 재사용하려고합니다. – Kyuubi

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 
+0

이것은 작동하지 않습니다. 코어 데이터 일대 다 관계는 NS (Mutable) Array가 아닌 NSSet으로 모델링됩니다. –

+0

NSSet =)에 대한 변경 내용이 좋음 –