CoreData如何将关系实体连接到已预加载数据的另一个实体?

时间:2014-06-22 09:47:04

标签: objective-c core-data relationship

这是我在CoreData中的第一个应用程序,所以我肯定在这里遗漏了一些东西,但是我花了一个多星期试图找到解决方案,显然没有人在互联网上遇到同样的问题;)

我正在创建像deckbuilder app这样的东西: 我的模型如下所示:coredatamodel

从CARD到SET,关系是一对一和多对(每张卡可以在一个集合中,并且在每个集合中可以是多张卡片)。

为简单起见,我想专注于 CARD SET 实体。 我将数据从CSV文件预加载到SET中5个属性 - 没有填充关系“karty”因为我不知道如何做到这一点。该实体中大约有25条记录。

现在,问题是我正在尝试填写将拥有超过500条记录的CARDS实体。 尝试我在SO上找到的几个选项,我在SET中也创建了500条记录的连接:/所以它看起来像sql“JOIN”命令。

  1. 我想要的是将数据加载到CARDS并以某种方式将它们连接到SET而不改变SET中的记录数。

  2. 如果我有property (nonatomic, retain) NSSet *karty; NSSet究竟是什么意思?它是什么但是一套什么?来自Card实体的单行集?卡对象集?一套NSStrings?一组NSManagedObjects?

  3. 在正常的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
    

    我使用方法

    将卡预加载到SET
    -(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]);
        }
    
    }
    

    另一种方法(在pastebin上不要淹没你的屏幕 - &gt; preloadAllCardsToDatabase

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好的,我终于做到了。不得不在循环外移动一些CoreData东西。 仍然不明白这整个魔术,但至少它的工作原理。 对于那些感兴趣的人,这是我的预加载功能 - &gt; here