iOS / iPhone核心数据关系

时间:2011-03-01 07:15:57

标签: iphone ios core-data relationship

我一直在努力寻找一个好的CoreData教程,专注于具有一对多和多对多关系的更高级数据库。从我读过的内容来看,CoreData隐藏了通常处于多对多关系中的中间表。但我的问题更多的是如何使用CoreData设置一对多关系。

我的数据库的一部分由Category表和Item表组成。一个类别可以有很多项目。

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

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

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

一些代码:

[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]

我没有实现CoreDataGeneratedAccessors,我认为它们已经被创建和隐藏。

我尝试过两种方式设置关系,一次来自CATEGORY,一次来自ITEM 即     [[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示例,并且实际上具有一对多的关系(以及是什么链路)?

1 个答案:

答案 0 :(得分:3)

  

'非法尝试在不同背景下的对象之间建立关系'类别'

有你的问题。您不能在不同的上下文之间建立关系。

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