2014-06-22 25 views
0

這是我在第一CoreData應用程序,所以我肯定失去了一些東西在這裏,但我花了一個多星期試圖找到解決辦法,顯然沒有人在互聯網上有同樣的問題;)CoreData如何將關係實體連接到已經預加載數據的另一個實體?

我創建類似deckbuilder應用。 : 我的模型看起來是這樣的:coredatamodel

的關係是一對一和逆一對多(每卡可在一組,並在每一個組可以有很多卡)的卡要設置。

爲簡單起見,我想專注於CARDSET實體。 我從CSV文件預裝載數據到5個屬性 - 沒有填充關係「卡丁」,因爲我不知道如何做到這一點。這個實體大約有25條記錄。

現在,問題是我試圖填充CARDS實體將有超過500個記錄。 嘗試幾個選項,我發現在所以我結束連接,在SET中創建了500條記錄:/所以它看起來像SQL「JOIN」命令。

  1. 我想要的是將數據加載到卡並以某種方式將它們連接到SET而不改變SET中的記錄數。

  2. 如果我有property (nonatomic, retain) NSSet *karty; NSSet究竟意味着什麼?它是什麼但是設置了什麼?卡實體的單行設置?一套卡對象?一組NSStrings?一套NSManagedObjects?

在正常的SQL主鍵連接他們將是「nazwaszort」所以Card.nazwaszort = Set.nazwaszort。

Set.h

@class Card; 

    @interface Set : NSManagedObject 

    @property (nonatomic, retain) NSNumber * cykl; 
    @property (nonatomic, retain) NSNumber * czymajor; 
    @property (nonatomic, retain) NSString * nazwa; 
    @property (nonatomic, retain) NSString * nazwashort; 
    @property (nonatomic, retain) NSNumber * nrwcyklu; 
    @property (nonatomic, retain) NSSet *karty; 
    @end 

    @interface Set (CoreDataGeneratedAccessors) 

    - (void)addKartyObject:(Card *)value; 
    - (void)removeKartyObject:(Card *)value; 
    - (void)addKarty:(NSSet *)values; 
    - (void)removeKarty:(NSSet *)values; 

    @end 

Card.h

@class Frakcja, Kolekcja, Set; 

@interface Card : NSManagedObject 

@property (nonatomic, retain) NSNumber * czylimit; 
@property (nonatomic, retain) NSString * frakcja; 
@property (nonatomic, retain) NSString * icesila; 
@property (nonatomic, retain) NSNumber * iloscwsecie; 
@property (nonatomic, retain) NSNumber * influence; 
@property (nonatomic, retain) NSString * kodkarty; 
@property (nonatomic, retain) NSNumber * koszt; 
@property (nonatomic, retain) NSNumber * minimumdecksize; 
@property (nonatomic, retain) NSString * nazwa; 
@property (nonatomic, retain) NSString * nazwasetu; 
@property (nonatomic, retain) NSString * nazwaszort; 
@property (nonatomic, retain) NSNumber * nrcyklu; 
@property (nonatomic, retain) NSString * podtyp; 
@property (nonatomic, retain) NSString * strona; 
@property (nonatomic, retain) NSNumber * trashkoszt; 
@property (nonatomic, retain) NSString * typ; 
@property (nonatomic, retain) Kolekcja *ilewkolekcja; 
@property (nonatomic, retain) Frakcja *nazwafrakcji; 
@property (nonatomic, retain) Set *wjakimsecie; 

@end 

我預裝卡的使用方法

-(void) preloadDataPackInfoToDatabase { 

    NSError *error=nil; 

NSString *sciezka = [[NSBundle mainBundle]pathForResource:@"nrsets" ofType:@"csv"]; 
    NSArray *rows = [NSArray arrayWithContentsOfCSVFile:sciezka]; 
for (int i=1; i <=([rows count]-1); i++) { 
     Set *nowyDataPack = [NSEntityDescription insertNewObjectForEntityForName:[entityset name] inManagedObjectContext:_contextdp]; 
     NSLog(@"tablica wierszy %@",rows[i][2]); 

     NSString *koddodatku = rows[i][2]; 
     NSLog(@"kod dodatku:%@",koddodatku); 
     NSString *nrwcyklu = rows[i][4]; 
     NSString *nrcyklu = rows[i][3]; 
     NSString *nazwadatapack =rows[i][3]; 
     NSString *czymajor =rows[i][0]; 
[nowyDataPack setValue:nazwadatapack forKey:@"nazwa"]; 
     NSNumberFormatter *f = [[NSNumberFormatter alloc]init]; 
     [f setNumberStyle:NSNumberFormatterDecimalStyle]; 

     NSNumber *nrwcykluint = [f numberFromString:nrwcyklu]; 
     NSNumber *nrcykluint = [f numberFromString:nrcyklu]; 
     NSNumber *czymajorbool = [f numberFromString:czymajor]; 

     [nowyDataPack setValue:nrwcykluint forKey:@"nrwcyklu"]; 
     [nowyDataPack setValue:nrcykluint forKey:@"cykl"]; 
     [nowyDataPack setValue:koddodatku forKey:@"nazwashort"]; 
     [nowyDataPack setValue:czymajorbool forKey:@"czymajor"]; 

    } 

    if (![ self.contextdp save:&error]) { 
     NSLog(@"Nieznany błąd %@,%@",error,[error userInfo]); 
    } 

} 

而另一種方法(在引擎收錄到SET不要淹沒你的屏幕 - >preloadAllCardsToDatabase

在此先感謝您的幫助。

+0

如果這是你的第一個應用程序不斷,這是很好的時間來啓動命名您的英語,小子:) –

+0

提供有關您的CSV –

+0

好,而不是更多的細節變量有史以來第一個應用程序,而不是第一次coredata,但我不喜歡使用的語言,我不是在變量和方法本地說話者:)我也開始命名我的方法在波蘭語,然後正是我知道什麼功能不浪費時間來額外翻譯步驟在我的腦海;) – Sebastian

回答

0

OK我終於做到了。必須在循環之外移動一些CoreData的東西。 仍然不明白這整個魔法,但至少它的作品。 對於那些有興趣,這是我的預加載功能 - >here

相關問題