2010-08-30 39 views
1

好的,这是情况。我有两个NSManagedObjects,分别叫做StoreAisle。从StoreAisle以及从AisleStore的一对一关系存在一对多关系。如何添加一个NSManagedObject到核心数据并指定它是“父”对象? (iPhone)

我在Core Data中添加了现有的商店,我可以很好地访问。我的问题是,我不知道如何将一个Aisle对象添加到现有的Store。我已经尝试撷取Store,然后加上一个Aisle对象到.Aisles组中,我使用由CoreData在Store.h提供的AddAislesObject:方法尝试,我已经尝试添加一个Store对象在Aisle对象的.Stores集。

我在看我的SQLite数据库,它看起来像Aisles正在成功添加,并且它们使用核心数据主键与正确的Store关联。但由于某种原因,当我尝试检索Aisle对象时(使用Store对象的.Aisles属性),我总是得到零计数。

我也尝试删除我的.sqlite文件无济于事。

有没有人有一些简单的代码,甚至是一个高层次的建议为最好的方式来做到这一点?

谢谢!

--- UPDATE 8/30 0917 CST

我已经采取了以下一些亚当的建议和我的过道肯定保存到核心数据正确。但是,当我尝试从Store对象访问已保存的通道时,我没有收到任何返回的东西。在下面的代码中,您可以看到我使用名称和位置从核心数据检索现有的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; 
} 

}

回答

2

不需要第三张表。

您可能在Store中有NSSet *,但您在Aisle中有Store *属性。遵循Core Data关于使每一个关系相反的建议,这是一个巨大的优势。

Store* store = [NSEntityDescription insertNewObjectForEntityForName:@"Store" inManagedObjectContext:moc]; 
Aisle* aisle = [NSEntityDescription insertNewObjectForEntityForName:@"Aisle" inManagedObjectContext:moc]; 

假设过道实体有关系的店内作为Store的一对多过道关系的逆:

aisle.inStore = store; 

你会发现核心数据需要的关系,即对方的护理将店铺添加到商店的NSSet。

不要忘记:

NSError *error; 
    if (![moc save:&error]) 
    { 
    NSLog(@"Core Data Save error %@, %@", error, [error userInfo]); 
    } 

到永久更改。

+0

谢谢Adam。我在保存通道时使用了这种通用格式,但是我根据您的示例进行了一些调整。核心数据中确实存在过道,但我仍然无法从Store对象中检索它们。我会在上面的原始问题中发布更多内容。 – Haeriphos 2010-08-30 13:47:48

+0

这个问题实际上是与数据模型有关的。我删除它并重新创建它(没有更改),现在它工作正常。 – Haeriphos 2010-08-31 04:58:38

0

如何滑倒这两个表之间的第三表格将它们连接起来?这将商店与Aisles ID配对,并提供双向连接。称它为StoreAisle。

你有一个商店,想要过道?在商店表中找到您想要的商店,获取该商店ID,查看StoreAisle表,从Aisles表中查找通道的ID。

你有一个过道,想要商店?在通道表中找到您想要的通道,获取该ID并在StoreAisle表中查找商店ID,然后查看Store表。

+0

我已经考虑过这个问题,或者至少使用PK标识符来编写自己的查询,这样我就不必依赖Store对象来访问通道。我不认为这是“正确”的方式。你知道我将如何去检索一个对象的核心数据生成的PKID吗? – Haeriphos 2010-08-30 16:12:21

2

首先,您的关系是从StoreAisle实际上叫做Aisles还是叫做aislesaisle?确保你所有的拼写都是正确的。此外,关系应该被称为aisles,因为它是一种关系,而不是一个实体,它是对多。您还应该确保从AisleStore(应该被称为store)之间的一对一关系是多对多StoreAisle之间关系的的反比关系。然后,如果你抓住一个Store实体并使用NSSet *aisleSet = storeEntity.aisles;,你应该得到一个正确的集合。

+0

从Store到Aisle的关系称为通道,我只是将关系的名称从Aisle更改为Store以存放在Store中。它们被配置为相互之间的反向关系。但是,它仍然无法正常工作。我看到SQLite中的Aisle条目,但无法使用Store对象检索它。 – Haeriphos 2010-08-30 16:10:56

相关问题