【发布时间】:2010-08-30 04:22:29
【问题描述】:
好的,情况就是这样。我有两个NSManagedObjects,分别称为Store 和Aisle。从Store 到Aisle 存在一对多关系,从Aisle 到Store 存在一对一关系。
我在 Core Data 中添加了现有的商店,我可以正常访问。我的问题是我无法弄清楚如何将Aisle 对象添加到现有的Store。我尝试获取Store,然后将Aisle 对象添加到.Aisles 集合中,我尝试使用CoreData 在Store.h 中提供的AddAislesObject: 方法,我尝试添加@ 987654335@ 对象到.Stores 设置在Aisle 对象中。
我正在查看我的 SQLite 数据库,看起来 Aisles 已成功添加,并且它们使用 Core Data 主键关联到正确的 Store。但是由于某种原因,当我尝试检索 Aisle 对象(使用获取的 Store 对象的 .Aisles 属性)时,我总是得到一个零计数 NSSet。
我也尝试删除我的 .sqlite 文件,但无济于事。
有没有人有一些简单的代码,甚至是关于最好的方法的高级建议?
谢谢!
--- 更新 8/30 0917 CST
我在下面采纳了 Adam 的一些建议,我的过道肯定会正确保存到 Core Data 中。但是,当我尝试从 Store 对象访问已保存的 Aisle 时,我没有得到任何返回。在下面的代码中,您可以看到我正在使用名称和位置从 Core Data 检索现有的 Store 对象(插入时有保护措施以确保此组合是唯一的)。然后我使用一些 NSLog 调试来访问返回数组中的单个 Store,并使用 aisles 属性遍历任何通道。忽略调试循环下面的所有内容,因为我还没有完成方法。
我看到的是 aisleList 中有零个对象。
-(NSArray *)getAisleListByStore: (Store *)aStore {
// this method should return an NSArray of aisles for aStore
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Store" inManagedObjectContext:context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name MATCHES[c] %@ AND location MATCHES[c] %@", aStore.name, aStore.location];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *storesList = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if (storesList == nil || [storesList count] != 1) {
// error detected
NSLog(@"Error retrieving stores: %@", [error localizedDescription]);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error retrieving stores" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
[alert release];
return nil;
} else {
// get aisles
// debugs
for (Store *theStore in storesList) {
NSLog(@"Name: %@", theStore.name);
NSLog(@"Aisle count: %d", [theStore.aisles count]);
NSSet *aisleList = theStore.aisles;
for (Aisle *theAisle in aisleList) {
NSLog(@"Aisle name: %@", theAisle.name);
}
}
// Store *theStore = [storesList objectAtIndex:0];
// NSArray *aisles = (NSArray *)theStore.aisles;
// return aisles;
}
}
【问题讨论】:
标签: iphone objective-c core-data