我一直在试图找到一个很好的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的例子是行走有多个表并且实际上具有一对多关系(以及链接是什么)?
这是我的逻辑倒台,谢谢。我必须记住该项目的名称,然后在合并后再次搜索它。然后我设定了关系。 – MrD
我有另一个后续问题/错误。在修改类别表中的条目后,代码未保存。这一切都适用于初始运行,但是在重新加载应用程序时,没有任何关系存在。在编辑完某些东西之后,是否需要在MOC上调用保存? CoreData是否看不到它已被修改并重新更新? – MrD
你必须自己保存。而且你必须检查错误,如果我没有记错的话,如果出现错误,保存失败就会失败。 iOS Coredata模板将它们的上下文保存在applicationWillTerminate:和applicationDidEnterBackground:中。但是,在完成一系列更改之后,保存这些信息是一种很好的做法。这样,当应用程序崩溃时,您不会失去所有更改。 –