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には何も表示されません)。私は賢明な関係が欠けていることを知っていますが、私はそれに指を置くことができません。