如何将NSManagedObject添加到核心数据并指定它';s";“家长”;对象(iPhone)
好的,情况是这样的。我有两个如何将NSManagedObject添加到核心数据并指定它';s";“家长”;对象(iPhone),iphone,objective-c,core-data,Iphone,Objective C,Core Data,好的,情况是这样的。我有两个NSManagedObjects名为Store和roach。从商店到过道之间存在一对多关系,从过道到商店之间存在一对一关系 我在核心数据中添加了现有存储,可以很好地访问这些存储。我的问题是,我不知道如何将过道对象添加到现有的商店。我尝试获取商店,然后将过道对象添加到过道集合,我尝试使用过道对象中的CoreData提供的AddAislesObject:方法,我尝试将商店对象添加到过道对象中的商店集合 我正在查看我的SQLite数据库,看起来通道正在成功添加,并且它们使用
NSManagedObjects
名为Store
和roach
。从商店
到过道
之间存在一对多关系,从过道
到商店
之间存在一对一关系
我在核心数据中添加了现有存储,可以很好地访问这些存储。我的问题是,我不知道如何将过道
对象添加到现有的商店
。我尝试获取商店
,然后将过道
对象添加到过道
集合,我尝试使用过道
对象中的CoreData提供的AddAislesObject:
方法,我尝试将商店
对象添加到过道
对象中的商店
集合
我正在查看我的SQLite数据库,看起来通道
正在成功添加,并且它们使用核心数据主键关联到正确的存储
。但是由于某种原因,当我尝试检索过道
对象时(使用已获取存储
对象的.Aisles
属性),我总是得到一个零计数NSSet
我还尝试删除我的.sqlite文件,但没有成功
是否有人有一些简单的代码,甚至是一个最好的方法做这件事的高级建议
谢谢大家!
---更新8/30 0917 CST
我已经采纳了Adam的一些建议,我的通道绝对正确地保存到核心数据中。但是,当我试图从Store对象访问保存的过道时,我没有得到任何返回的内容。在下面的代码中,您可以看到我正在使用名称和位置从核心数据中检索现有的存储对象(insert上有一些保护措施,以确保此组合是唯一的)。然后,我使用一些NSLog调试来访问返回数组中的单个存储,并使用aisles属性来迭代任何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;
}
}在这两张桌子之间滑动第三张桌子来连接它们怎么样?这将与通道ID配对存储,并提供通道连接。叫它商店过道 你有一家商店,想要过道吗?在store表中找到您想要的店铺,获取该店铺ID,在StoreRoadle表中查找,以从Airles表中找到过道的ID
你有一条过道,想去商店吗?在过道表中找到所需的过道,获取该ID并在store过道表中查找店铺ID,然后在store表中查找。在这两个表之间滑动第三个表以连接它们如何?这将与通道ID配对存储,并提供通道连接。叫它商店过道 你有一家商店,想要过道吗?在store表中找到您想要的店铺,获取该店铺ID,在StoreRoadle表中查找,以从Airles表中找到过道的ID
你有一条过道,想去商店吗?在过道表中找到所需的过道,获取该ID并在store过道表中查找店铺ID,然后在store表中查找。无需第三张表 您可能在商店中有一个NSSet*,但在过道中有一个Store*属性。这是遵循核心数据的建议,使每一种关系都有一个反向关系的一个巨大优势
Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store" inManagedObjectContext:moc];
Aisle* aisle = [NSEntityDescription insertNewObjectForEntityForName:@"Aisle" inManagedObjectContext:moc];
假设过道实体与门店的关系与门店与多个过道的关系相反:
aisle.inStore = store;
您会发现核心数据负责关系的另一面,即将过道添加到商店的NSSet
别忘了:
NSError *error;
if (![moc save:&error])
{
NSLog(@"Core Data Save error %@, %@", error, [error userInfo]);
}
使您的更改永久化。无需第三个表 您可能在商店中有一个NSSet*,但在过道中有一个Store*属性。这是遵循核心数据的建议,使每一种关系都有一个反向关系的一个巨大优势
Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store" inManagedObjectContext:moc];
Aisle* aisle = [NSEntityDescription insertNewObjectForEntityForName:@"Aisle" inManagedObjectContext:moc];
假设过道实体与门店的关系与门店与多个过道的关系相反:
aisle.inStore = store;
您会发现核心数据负责关系的另一面,即将过道添加到商店的NSSet
别忘了:
NSError *error;
if (![moc save:&error])
{
NSLog(@"Core Data Save error %@, %@", error, [error userInfo]);
}
使您的更改永久化。首先,您从
商店
到过道
的关系实际上称为过道
,还是称为过道
或过道
?确保你所有的拼写都正确。此外,该关系应被称为aisles
,因为它是一种关系,而不是一个实体,对许多人来说都是如此。您还应确保从过道
到商店
(应称为商店
)的一对一关系是对多商店
到过道
关系的反向关系。然后,如果您抓取一个Store
实体并使用NSSet*aisleSet=storeEntity.aisles代码>你应该得到一套正确的设置。首先,你从商店
到过道
的关系实际上是称为过道
还是称为过道
或过道
?确保你所有的拼写都正确。此外,该关系应被称为aisles
,因为它是一种关系,而不是一个实体,对许多人来说都是如此。您还应确保从过道
到商店
(应称为商店
)的一对一关系是对多商店
到过道
关系的反向关系。然后,如果您抓取一个Store
实体并使用NSSet*aisleSet=storeEntity.aisles代码>您应该得到正确的设置。谢谢Adam。我在保存过道时使用了这种通用格式,但我根据您的示例做了一些调整。过道绝对是萨维