2009-11-15 11 views
18

Temel veri belgelerini okuyor ve hala bir şeyleri kaçırdığımı hissediyorum.iPhone core verileri yeni nesnelere ekleme

Nesneleri başka bir nesnenin ilişkisine nasıl eklediğinizi tam olarak anlamıyorum.

Örneğin aşağıdaki iki Varlıkları Yani benim verileri birkaç havaalanları için farklı kalkış panoları bir listesini içeren maketimin

flightDepartureBoard 
name: 
from_airport: 
to_airport: 
current_flights: (this is a one to many relationship of flight detail entities) 

flight_details 
arrive 
depart 
name 

içindedir. Her kalkış kurulu daha sonra o havalimanının mevcut geliş ve gidişleri hakkında bilgi içeren bir dizi flight_detail içerir.

Mevcut anlayışım, belirli bir kalkış kurulu için uçuş ayrıntılarını eklemek, yönetim kurulu için manageObject öğelerini almalı, ardından her uçuş için yeni bir yönetilen nesne oluşturmalı ve uygun şekilde değerlerini ayarlamalı ve ardından uçuşu bir NSSet oluşturmalıdır. yönetilen nesneler ve depatureboards manageObject current_flight'ları (ilişki) yeni oluşturulan NSSet'e ayarlar. Bu doğru mu?

Yeni giriş eklemek istersem ne olur? İlk önce tüm seti almam gerekmiyor mu? Herhangi bir yardım için

Teşekkür .. ben sadece flightDetails geçerli nesneye ilişkiyi ayarlayabilirsiniz fark rağmen


+0

[uçuşlar addObject: details] derken, bir derleyici uyarısı alıyor musunuz? İlişkinin bir NSMutableSet değil, bir NSSet olduğunu görüyorum. – user798719

cevap

25

veri modelindeki ilişkiyi tanımlarken .. yerine nesne set, içeren nesnenin başlığında tanımlanmıştır. Normal NSMutableSet yöntemlerini kullanarak kümedeki öğeleri ekleyin veya kaldırın. Apple'dan Yer örnek kapmak Eğer

Task* newTask = [NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext]; 

ve hiçbir ilişkileri içeriyor olsa bunu çözmek olacaktır oradan çalışır:

gibi bir şey yapacak bir yeni yönetilen varlık eklemek için. Her şeyi elde etmek için sadece veri modelinizi olması gereken şey olarak değiştirin ve bir ilişki olarak düşünmeyin, sadece “A'nın bir NSMutableSet B'si” olduğunu düşünün. Belgelerin önerildiği gibi ters ilişkiyi tanımladığınızdan, B'nin A'nın ne olduğu hakkında düşünmenize gerek yok, sadece sizin için önemli olan şey olduğunda B açısından düşünmeye başlamalısınız.

Diyelim ki bir tahta nesnesi olan bir Havaalanı nesne var (ve daha sonra tıpkı ilişkiyi senin Uçuş gerekli nesneleri oluşturmak ve ayarlamak, değişken routingArray ile Flight içine kalkış ve varış yerlerinin set hayal diyelim:

Flight* newFlight = [NSEntityDescription insertNewObjectForEntityForName:@"Flight" inManagedObjectContext:self.managedObjectContext]; 
[newFlight setRoute:routingArray]; 
[Airport.Board.flights addObject:newFlight]; 

Uçuş iptal edildiğinde (United, lanet olsun!), Sadece o sette bulunan uçuşu kaldıramazsınız ve nil olduğu görüldüğü nesneye erişmeye çalışan herkes, bu sayede yolcuları neşeyle mahvedebilirsiniz.

+0

Harika teşekkürler, bu tam olarak merak ettiğim şey. Görevi benzer bir şeyle başarmayı başardım, ancak yansıma üzerine hala pek yerinde olmadım. –

+0

Söylemeyi unuttum- veri modelini değiştirdikten sonra gerçekleşen ilk şey her şeyin çökmesidir - ya da Core Data init işlevlerindeki depolama dosyasının adını değiştirirseniz (doğru şekilde değil) ya da veri modeli (doğru yol) - büyük CD belgelerinde biraz daha ileri gidin ve model sürümü ekleyerek gerçekten kolay bulacaksınız. Cevapdan memnunsanız, kabul her zaman takdir edilir. –

25

Birkaç seçenek vardır:
1.Bir NSManagedObject üzerinde add<Key>Object: kullanabilirsiniz:

NSManagedObject *flightBoard = [NSEntityDescription insertNewObjectForEntityForName:@"FlightDepartureBoard" inManagedObjectContext:self.managedObjectContext]; 
NSManagedObject *details = [NSEntityDescription insertNewObjectForEntityForName:@"Flight_Details" inManagedObjectContext:self.managedObjectContext]; 
[flightBoard addCurrent_flightsObject:details]; 

bir derleyici uyarı alacak olsa da bir kategoride erişimcilere tanımlamak sürece:

@interface NSManagedObject (Current_flightsAccessors) 
- (void)addCurrent_flightsObject:(NSManagedObject *)value; 
- (void)removeCurrent_flightsObject:(NSManagedObject *)value; 
- (void)addCurrent_flights:(NSSet *)value; 
- (void)removeCurrent_flights:(NSSet *)value; 
@end 

2. alt sınıf.

FlightDepartureBoard.h:

#import <CoreData/CoreData.h> 
@class Flight_Details; 
@interface FlightDepartureBoard : NSManagedObject 
{ 
} 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * from_airport; 
@property (nonatomic, retain) NSString * to_airport; 

@interface FlightDepartureBoard (CoreDataGeneratedAccessors) 
- (void)addCurrent_flightsObject:(Flight_Details *)value; 
- (void)removeCurrent_flightsObject:(Flight_Details *)value; 
- (void)addCurrent_flights:(NSSet *)value; 
- (void)removeCurrent_flights:(NSSet *)value; 
@end 

FlightDepartureBoard.m:

#import "FlightDepartureBoard.h" 
#import "Flight_Details.h" 
@implementation FlightDepartureBoard 
@dynamic name; 
@dynamic from_airport; 
@dynamic to_airport; 
@dynamic current_flights; 
@end 

3 Sen-çok ilişkileri için erişenleri içerecektir hangi modelden sınıf dosyaları oluşturabilir Değişken kümesini alabilir ve mutableSetValueForKey: 'yi kullanarak değiştirebilirsiniz. Örneğin,

Daha fazla bilgi için, Managed Object Accessor Methods'a bakın.

+0

Mükemmel teşekkürler şimdi anlıyorum. Çözümü belgelerden göremedim. –

+0

Bu cevabı veya Adam'ın yararını bulduysanız, lütfen bunlardan birini kabul edin. – gerry3

+0

Bu site için hala üzgünüm. Her iki cevap da gerçekte eşit derecede yardımcıydı. Yardımın için teşekkürler, çok takdir ediyorum. –