2

Apple開発者のCoreDataのドキュメントをもう一度読んだところ、SQLLiteエンティティを作成する際のグラフィカルなXcode 4エディターに関しては、Xcode 3でIBが分離されていたときに欠けていたのと同じように、欠けていることがわかりました。

3つのテーブル:

  • ZipData
  • LocationData
  • クロスリファレンス

CrossReferenceにはZipDataとLocationDataの主キーがあるため、CrossReferenceにクエリを実行するだけで、場所のすべてのzipまたはzipのすべての場所を取得できます。これはもちろん、ZipDataとLocationDataの両方(およびおそらくCrossReference?)での多対関係を意味します。

私が持っている(それは機能していない)関係に関してはこれです:

  • ZipDataには、LocationDataを指し、逆の関係「locations」があります。
  • LocationDataには、ZipDataを指し、逆の関係「zipsCodes」があります。
  • CrossReferenceテーブルには2つの関係があります。1つはZipData(および逆)、もう1つはLocationData(および逆)です。

まだNSManagedObjectsとしてエンティティをサブクラス化していない。セットアップしたものが機能するかどうかを確認するために、viewDidLoadメソッドで以下のコードを実行しているだけです。

// test/learn the core data frame work
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *locationData = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"LocationData" 
                                   inManagedObjectContext:context];
[locationData setValue:@"Testville" forKey:@"City"];
[locationData setValue:@"United Tests" forKey:@"Country"];
[locationData setValue:@"County of Test" forKey:@"County"];
NSManagedObject *zipCodeData = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"ZipCodeData" 
                                      inManagedObjectContext:context];
[zipCodeData setValue:[NSNumber numberWithDouble:1111.00] forKey:@"Income"];
[zipCodeData setValue:[NSNumber numberWithDouble:22.00] forKey:@"LandArea"];
[zipCodeData setValue:@"23060" forKey:@"ZipCode"];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"CrossReference" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
    NSLog(@"LocationId: %@", [info valueForKey:@"LocationDataId"]);
    NSManagedObject *details = [info valueForKey:@"details"];
    NSLog(@"ZipId: %@", [details valueForKey:@"ZipCodeDataId"]);
}        
[fetchRequest release];

私はこれらの関係を設定する方法を理解しておらず、どういうわけか主キーが設定されており、エンティティが一緒に道を見つけることを信頼する方法がわかりません。

シミュレーターのsqllitedbを表示すると、テストエンティティが永続化されていることがわかりますが、ログには何も返されません(ただし、CrossReferenceには何も表示されません)。私は賢明な関係が欠けていることを知っていますが、私はそれに指を置くことができません。

4

1 に答える 1

7

あなたの主な問題は、以下の太字のフレーズで明らかになります。

Apple開発者のCoreDataのドキュメントをもう一度読んだところ、 SQLLiteエンティティを作成する際のグラフィカルなXcode 4エディターに関しては、Xcode 3でIBが分離されていたときに欠けていたのと同じように、欠けていることがわかりました。

3つのテーブル:

ZipDataLocationData相互参照

CrossReferenceにはZipDataとLocationDataの主キーがあるため、CrossReferenceにクエリを実行するだけで、場所のすべてのzipまたはzipのすべての場所を取得できます。

SQLite entitiesコアデータにはテーブルや主キーがありません。

コアデータはSQLではありません。エンティティはテーブルではありません。オブジェクトは行ではありません。属性は列ではありません。関係は結合ではありません。Core Dataは、オブジェクトグラフを永続化する場合としない場合があり、SQLを舞台裏で使用する場合と使用しない場合があるオブジェクトグラフ管理システムです。SQL用語でコアデータを考えようとすると、コアデータを完全に誤解し、多くの悲しみと無駄な時間をもたらします。

あなたはSQLの熟練者によくある間違いを犯しています。CoreDataは手続き型SQLの軽量オブジェクトラッパーであると想定しています。そうではない。SQLiteストアは4つの永続性オプションの1つにすぎず、データモデル自体は、選択した永続性オプションとは完全に独立しています。つまり、同じモデルがすべてのタイプのストアで機能します。店舗は、生きているオブジェクトのグラフをアーカイブおよびアーカイブ解除(凍結乾燥および再水和)するためのまったく異なる手段です。特定のグラフがどのように永続化されるかは、ほとんどの場合無視できる実装の詳細の裏側です。SQLについて知っていることはすべて忘れてください。コアデータを理解するのに役立たないからです。

ここでの特定の問題は、オブジェクト間の関係を設定しないことです。CrossReferenceしたがって、オブジェクトを作成し、その関係を設定する必要があります。

  NSManagedObject *crossReference = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"CrossReference" 
                                   inManagedObjectContext:context];     
  [crossReference setValue:locationData forKey:@"location"]; 
  [crossReference setValue:zipCodeData forKey:@"zipCode"];

LocationDataコンテキストにより、関連オブジェクトとオブジェクトに相互関係が設定されZipDataます。

Core Dataをマスターするための鍵は、永続性の形式を無視し、代わりに属性と関係を持つオブジェクトの観点からのみ考えることです。その概念を実際に内面化すると、すべてのものが簡単に適切に配置されます。

于 2011-06-29T19:54:39.917 に答える