2013-06-10 30 views
13

Temel Veri Modeli'ni iOS'ta nasıl uygulayacağımızı öğrenmeye yeni başladım. Varlıklar arasında birebir ilişkiyi nasıl saklayacağınız ve nasıl alacağınız ile ilgili bazı temel öğreticilerden sonra, şimdi bire kadar bir ilişkiyi uygulamaya çalışıyorum. aşağıdaki gibi Benim veri modeli tanımlı kendi sınıfları ile iki tarafın oluşur:Temel Veriler: Bir Çok İlişkiye Bire Bir Yerleşim Ekleme

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 

ben eklemek için NSMutableSet kullanılan benzer sorular bulundu, ancak ben bir NSMutable Array için aynı uygulamaya kuramıyorum. Ben JSON aracılığıyla Restaurant ve yorumlar için veri almak ve CORE Veritabanı bunları kaydetmeden önce geçici sınıflar saklayabilirsiniz

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

: gibi

anda benim yerleştirme kodu görünüyor. Bir ile Çok İlişkisi olan verileri nasıl ekleyebilirim?

DÜZENLEME: anda I çekirdek veri modeli eklemek için bu aynı sınıf uygulamak çalışıyorum

NSMutableArray *user_reviews; 

olarak user_review özelliğini tanımlayan bir sınıf biçiminde veri alır. Ancak çekirdek veri modeli, NSMutableArray yerine NSSet kullanır. Bir kaba yaklaşım, NSMutableArray kullanmak yerine tüm sınıfları aynı özelliklerle çoğaltmak, NSSet olarak değiştirmektir. Ancak, bu büyük miktarda gereksiz kod oluşturur. Bunu yapmanın daha verimli bir yolu olmamalı mı? senin İnceleme senin coreDataModel bir ilişki olacaktır eğer

cevap

20

, NSMutableArrayNSSet yerine kullanabilir ve Restoran Varlık ile bağla. İncelemede

: In Restaurant enter image description here

: Eğer xcode sınıfınızı oluşturmak izin verirsek enter image description here

, bu gibi görünecektir:

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 

Çağrı olacaktır:

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 

edit

NSMutableArray olması gerekiyorsa, bu bir artış olamaz.
Bunlar her zaman NSSets (x'den n'ye) veya hedef sınıflardır. NSMutableArray'u kullanmak, setlerin ve otomatik işlemenin avantajlarını kullanır. Eğer gerçekten NSMutableArray saklamak istiyorsanız

Ama en azından bir reviewID özellik (benzersiz) tarafından Review sınıfını genişletmek ve NSMutableArrayTransformable olarak saklamak için salık vermek.

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

Doğru, sadece kodunuzu bu kısımda kopyala/yapıştırın^^ NSObjects' değil, “NSManagedObjects” ile ilgili bir sorun var mı? Bu çözüme karşı bir gerekçe varsa, lütfen bana söyleyin :) – geo

+0

* "... hatırladığım kadarıyla" * - Bu * doğrudur * Restoran.user_reviews ve Review.restaurant ** ters ilişkiler olarak düzenleniyorsa * * Ekran görüntüsü belirttiği gibi. –

+0

Sorun bu. İlk önce tüm verileri bir API'den online olarak RestKit 0.20 yardımıyla yüklüyorum. Restkit, tüm İlişkileri bir NSSet yerine bir dizide yükler. Restkit'in verileri yüklemek/eşlemek için "Restaurant.h" için bir sınıf tanımladım. Şimdi, verileri Çevrimdışı erişim için kullanılabilir olacak şekilde Çekirdek Veri Modeli'ne yükleyerek depolamaya çalışıyorum. Ama bunu yapmak için her varlık için sınıfları oluşturmam gerekiyor. NSMutableArray ve NSSet dışında her şey aynı olduğu için RestKit API'si için yaptığım sınıfları yeniden kullanıyorum. – 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

Bu işe yaramaz. Bir Çekirdek Veri ile çok ilişkisi, NS (Değişken) Dizisi değil, NSSet olarak modellenir. –

+0

tamam NSSet için kötü değişiklik =) –