2012-05-05 2 views
0

У меня много проблем с CoreData. Кривая обучения очень крутая. Я довольно новичок XCode и не знаю много о базах данных. Я потратил немало времени, пытаясь понять, какой подход подходит для моей программы и как-то споткнулся.XCode 4.2 CoreData Добавление данных в NSS для привязки сущностей «один ко многим»

Я пытался узнать sqlite, потому что это то, что я думал, что используется coreData. Итак, я создал огромную базу данных со многими связями в LibreOffice, потому что это была бесплатная программа базы данных. Затем я понял, что это было в HSQL, которое отличается от SQLite. Итак, мне пришлось экспортировать все в .csv и потерять мои отношения, а затем заплатить за дерьмовую программу под названием SQLiteManager для создания таблиц базы данных SQLite.

Как только у меня было все настройки, я снова начал смотреть на CoreData, и я понял, что CoreData не позволяет вам использовать внешнюю базу данных sqlite! Aghh. На данный момент я очень расстроен. Итак, теперь я снова начал с нуля с помощью coreData и построил свою пустую модель с сущностями, атрибутами, отношениями и т. Д. Все в управляемой форме объекта. Я проверил, что он может создавать пустую «проприетарную» базу данных coreData SQLite при ее создании, и это работает.

Но теперь, я пытаюсь заполнить managedObjects, но у меня возникают проблемы с отношениями

Это то, что один из моих файлов заголовков выглядит.

#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. Итак, я потерян. Пожалуйста помоги?????????

ответ

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]; 
} 
+0

ahhh ... позвольте мне попробовать. Это выглядит умно. Единственное, что, однако, состоит в том, что у меня нет отношений, встроенных в список, который я читаю. Я просто пытался проверить добавление отношений в объект, управляемый ячейкой. Они должны действительно сделать какой-то графический способ сделать это. – esd100

+0

Yay! ... это сработало! Большое спасибо, мой друг! Любые советы о том, как заполнить базу данных CoreData, кроме как делать подобные вещи в моем приложении, запускались до тех пор, пока они не будут готовы. Хотелось бы, чтобы был графический способ сделать это, как с таблицами SQL. – esd100

+0

Скажем, у меня был стол CELL, и у меня был стол ORGANS, и они были предварительно заполнены. Как я могу добавить многие из многих отношений? например. Я хочу взять CELL A и сказать, что он существует в ORGANS B, C и E. Как бы я это сделал? Ваша помощь очень ценится. – esd100