2012-05-05 9 views
0

CoreDataには多くの問題があります。学習曲線は非常に急である。私はかなり初心者のXCodeユーザーで、データベースについてもあまり知らない。私はかなりの時間をかけて自分のプログラムにどのようなアプローチをとっているのか理解しようとしてきましたが、本当につまずいてきました。XCode 4.2 CoreData NSSetに1対多のエンティティリレーションシップを追加する

私はcoreDataが使用したと思ったので、私はsqliteを学ぼうとしました。だから、私はLibreOfficeで多くの関係を持つ巨大なデータベースを作ったのは、それが無料のデータベースプログラムだったからです。それから、私はそれがSQLiteとは異なるHSQLにあることに気付きました。だから、私はすべてを.csvにエクスポートしなければならなかったし、私の関係を失った後、SQLiteデータベーステーブルを作成するためにSQLiteManagerという厄介なプログラムを支払った。

セットアップが完了したら、CoreDataをもう一度見て、CoreDataで外部のsqliteデータベースを使用できないことに気付きました。ああ。この時点で、私はかなり不満を抱いています。ですから、今度は、coreDataを使って最初からやり直して、エンティティ、属性、リレーションシップなどを持つすべての空のモデルを管理されたObjectフォームに構築しました。ビルド時に空の「独自の」coreData SQLiteデータベースを作成でき、それが動作することを確認しました。

しかし、今、私はmanagedObjectsに記入しようとしているんだけど、これは私のヘッダファイルのいずれかが次のようになります関係

とのトラブルを抱えています。 、私は私が私の古いDBに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のデータベースを作成しようとしていますが、「@」(リソースセクション内のファイルを区切り

- (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

私は、残りの行にorgansである0以上の文字列があると仮定します。だから:

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

ああ...私はそれを試してみましょう。スマートに見える。しかし、唯一のことは、私が読んでいるリストに組み込まれた関係がないということです。私はちょうどセル管理オブジェクトへの関係の追加をテストしようとしていました。彼らは実際にこれを行うためのグラフィカルな方法をいくつか作成する必要があります。 – esd100

+0

よろしく!...それは働いた!どうも有り難う、わが友よ!私のアプリケーションでこのようなことをし続ける以外の方法でCoreDataデータベースを埋め込む方法に関するアドバイスは、準備が整うまで開始しました。私はSQLテーブルのように、それを行うためのグラフィカルな方法があったと思います。 – esd100

+0

私はCELLテーブルを持っていて、ORGANSテーブルを持っていて、あらかじめ設定されているとします。多対多の関係をどのように追加しますか?例えば。私はCELL Aを取ってORGANS B、C、&Eに存在していると言いたいと思います。どうすればそれを具体的に行うことができますか?あなたの助けが大変ありがとうございます。 – esd100

関連する問題