2011-03-01 139 views
0

我一直在试图找到一个很好的CoreData教程,它着重于具有一对多和多对多关系的更高级数据库。从我读过的内容可以看出,CoreData隐藏了通常处于多对多关系的中间表。但我的问题更多的是如何使用CoreData设置一对多关系。iOS/iPhone核心数据关系

我的数据库的一部分包含一个类别表和一个项目表。一个类别可以有很多项目。

在我的程序中,我达到了用户选择一个类别的位置,然后列表视图弹出,显示应该在该类别中的所有项目。

我可以添加一个项目到表格中,当我尝试在出现问题/崩溃时尝试将项目添加到具有与类别关系的表格中时。

该项目应该完全保存到数据库中,然后重新设置它并设置关系?

某些代码:

[item.m]

@interface ITEM : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) CATEGORY * category; 

@end 

[/item.m]

[category.m]

@interface CATEGORY : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSSet* items; 

@end 


@interface CATEGORY (CoreDataGeneratedAccessors) 
- (void)addItemObject:(item *)value; 
- (void)removeItemObject:(item *)value; 
- (void)addItems:(NSSet *)value; 
- (void)removeItems:(NSSet *)value; 

@end 

[/category.m ]

没有CoreDataGenerate dAccessors由我实现,我假设它们已经被创建和隐藏。

我尝试设置关系,一旦从CATEGORY和一次从项目 即 [[self category] ​​addItemObject:[self item]]; 以及 [[self item] setCategory:[self category]];

但是都没有成功...我得到这样的错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'category' between objects in different contexts (source = <NSManagedObject: 0x614b660> (entity: item; id: 0x61558f0 <x-coredata:///item/tF691713B-18B1-4D28-93CC-40327353C08F3> ; data: { 
    category = nil; 
    name = TestName; 

}) , destination = <CATEGORY: 0x4d55c20> (entity: category; id: 0x4d55050 <x-coredata://188D1CD9-6CC0-47EF-9C2A-A5DDDB1FAA24/category/p1> ; data: { 
    items = "<relationship fault: 0x4da4800 'items'>"; 
    name = "Test Category"; 
}))' 

所以我想这个问题应该是:我要去哪里错了,是有一个很好的教程,通过CoreData的例子是行走有多个表并且实际上具有一对多关系(以及链接是什么)?

回答

3

“非法尝试建立关系‘在不同的上下文

还有就是你的问题对象之间的类’。你不能在不同的上下文之间建立关系。

您可以重构代码,以便在将类别分配给它之前,只将其中一个NSManagedObjectContext或merge项目放入“主要上下文”中。

+0

这是我的逻辑倒台,谢谢。我必须记住该项目的名称,然后在合并后再次搜索它。然后我设定了关系。 – MrD

+0

我有另一个后续问题/错误。在修改类别表中的条目后,代码未保存。这一切都适用于初始运行,但是在重新加载应用程序时,没有任何关系存在。在编辑完某些东西之后,是否需要在MOC上调用保存? CoreData是否看不到它已被修改并重新更新? – MrD

+0

你必须自己保存。而且你必须检查错误,如果我没有记错的话,如果出现错误,保存失败就会失败。 iOS Coredata模板将它们的上下文保存在applicationWillTerminate:和applicationDidEnterBackground:中。但是,在完成一系列更改之后,保​​存这些信息是一种很好的做法。这样,当应用程序崩溃时,您不会失去所有更改。 –