XCode 4.2 CoreData将数据添加到NSSet一对多实体关系

时间:2012-05-05 00:35:43

标签: iphone core-data object-relationships

我在使用CoreData时遇到了很多困难。学习曲线非常陡峭。我是一个非常新手的XCode用户,对数据库也不太了解。我花了很长时间试图弄清楚我的计划采取了什么方法,并且真的一直在磕磕绊绊。

我试着学习sqlite,因为那是我认为的coreData使用的。因此,我在LibreOffice中创建了一个包含许多关系的庞大数据库,因为它是一个免费的数据库程序。然后,我意识到它是在HSQL中,这与SQLite不同。因此,我不得不将所有内容导出到.csv中并丢失了我的关系,然后支付了一个名为SQLiteManager的糟糕程序来创建SQLite数据库表。

一旦我完成了所有设置,我再次开始查看CoreData,并意识到CoreData不允许您使用外部sqlite数据库! Aghh。在这一点上,我非常沮丧。所以,现在,我已经从头开始使用coreData,并在托管对象表单中构建了包含实体,属性,关系等的空模型。我已经检查过它能够在构建时创建空的“专有”coreData SQLite数据库,并且可以工作。

但是现在,我正在尝试填写托管对象,但我遇到了关系问题

这是我的一个头文件。

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class ORGAN, SPECIMEN, SYSTEM, TISSUE;

@interface CELL : NSManagedObject

@property (nonatomic, retain) NSString * cellDescription;
@property (nonatomic, retain) NSString * cellName;
@property (nonatomic, retain) NSString * cellSID;
@property (nonatomic, retain) NSSet *organs;
@property (nonatomic, retain) NSSet *specimens;
@property (nonatomic, retain) NSSet *systems;
@property (nonatomic, retain) NSSet *tissues;
@end

@interface CELL (CoreDataGeneratedAccessors)

- (void)addOrgansObject:(ORGAN *)value;
- (void)removeOrgansObject:(ORGAN *)value;
- (void)addOrgans:(NSSet *)values;
- (void)removeOrgans:(NSSet *)values;

- (void)addSpecimensObject:(SPECIMEN *)value;
- (void)removeSpecimensObject:(SPECIMEN *)value;
- (void)addSpecimens:(NSSet *)values;
- (void)removeSpecimens:(NSSet *)values;

- (void)addSystemsObject:(SYSTEM *)value;
- (void)removeSystemsObject:(SYSTEM *)value;
- (void)addSystems:(NSSet *)values;
- (void)removeSystems:(NSSet *)values;

- (void)addTissuesObject:(TISSUE *)value;
- (void)removeTissuesObject:(TISSUE *)value;
- (void)addTissues:(NSSet *)values;
- (void)removeTissues:(NSSet *)values;

@end

并且,在我的applicationDelegate文件中,我尝试使用资源部分中的海关“@”分隔文件来填充我的coreData数据库(尽管我认为我可以运行SQLite连接到我的旧数据库并执行相同的操作,但是是另一个问题)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//cells
NSString *paths = [[NSBundle mainBundle] resourcePath];
NSString *bundlePath = [paths stringByAppendingPathComponent:@"cells"];
NSString *dataFile = [[NSString alloc] initWithContentsOfFile:bundlePath];
NSArray *dataRows = [dataFile componentsSeparatedByString:@"\n"];

for (int i = 0 ; i < [dataRows count] ; i++)
{
    NSArray *dataElements = [[dataRows objectAtIndex:i] componentsSeparatedByString:@"@"];
    if ([dataElements count] >= 2)
    {
        CELL *cellMO = [NSEntityDescription  insertNewObjectForEntityForName:@"CELL" 
                                 inManagedObjectContext:[self managedObjectContext]];

        cellMO.cellName = [dataElements objectAtIndex:0];
        cellMO.cellDescription = [dataElements objectAtIndex:1];

        cellMO.organs ???????????????????????????? can't make this work.  


    }
}

当我用这条线构建时,它一直在破碎,我尝试了几种不同的方法。它一直说cellMO.organs期待一个NSSet,但是当我试图给它一个NSSet时它失败了。所以,我迷路了。请帮忙?????????

1 个答案:

答案 0 :(得分:2)

我假设在该行的其余部分有0个或更多字符串为organs。所以:

if (i>1) {
   // if organ does not exist yet
   ORGAN *organMO = [NSEntityDescription  insertNewObjectForEntityForName:@"ORGAN" 
                             inManagedObjectContext:[self managedObjectContext]];
   organMO.name = [dataElements objectAtIndex:i];
   // otherwise fetch it
   [cellMO addOrgansObject:organMO];
}