这是我在CoreData中的第一个应用程序,所以我肯定在这里遗漏了一些东西,但是我花了一个多星期试图找到解决方案,显然没有人在互联网上遇到同样的问题;)
我正在创建像deckbuilder app这样的东西: 我的模型如下所示:coredatamodel
从CARD到SET,关系是一对一和多对(每张卡可以在一个集合中,并且在每个集合中可以是多张卡片)。
为简单起见,我想专注于 CARD 和 SET 实体。 我将数据从CSV文件预加载到SET中5个属性 - 没有填充关系“karty”因为我不知道如何做到这一点。该实体中大约有25条记录。
现在,问题是我正在尝试填写将拥有超过500条记录的CARDS实体。 尝试我在SO上找到的几个选项,我在SET中也创建了500条记录的连接:/所以它看起来像sql“JOIN”命令。
我想要的是将数据加载到CARDS并以某种方式将它们连接到SET而不改变SET中的记录数。
如果我有property (nonatomic, retain) NSSet *karty;
NSSet究竟是什么意思?它是什么但是一套什么?来自Card实体的单行集?卡对象集?一套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
我使用方法
将卡预加载到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
提前感谢您的帮助。
答案 0 :(得分:0)
好的,我终于做到了。不得不在循环外移动一些CoreData东西。 仍然不明白这整个魔术,但至少它的工作原理。 对于那些感兴趣的人,这是我的预加载功能 - &gt; here