我再次通读了 Apple 开发人员 Core Data 文档,发现它在创建 SQLLite 实体时缺少图形 Xcode 4 编辑器,就像我在 Xcode 3 中分离 IB 时发现它所缺少的一样。
三张表:
- 压缩数据
- 位置数据
- 交叉引用
CrossReference 具有 ZipData 和 LocationData 的主键,因此我只需要查询 CrossReference 即可获取位置的所有 zip 或 zip 的所有位置。这当然意味着 ZipData 和 LocationData 上的一对多关系(也许在 CrossReference 上?)。
我所拥有的(那是行不通的)关系方面是这样的:
- ZipData 有一个关系“位置”,它指向 LocationData 并且是反向的
- LocationData 有一个关系“zipsCodes”,它指向 ZipData 并且是反向的
- CrossReference 表有两种关系,一种与 ZipData(并且是反向的)和一种与 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];
我不明白如何设置这些关系,也不知道如何相信主键已设置好,而实体只是找到了一起的方式。
即使当我查看模拟器 sqllite db 时我看到测试实体已被持久化(但在 CrossReference 中没有任何内容),我在日志中什么也没有得到。我知道我在关系方面错过了一些东西,但我不能指望它。