iOS / iPhone CoreData 关系

Posted

技术标签:

【中文标题】iOS / iPhone CoreData 关系【英文标题】:iOS / iPhone CoreData Relationships 【发布时间】:2011-03-01 07:15:56 【问题描述】:

我一直在努力寻找一个好的 CoreData 教程,该教程侧重于具有一对多和多对多关系的更高级的数据库。根据我的阅读,CoreData 隐藏了通常处于多对多关系的中间表。但我的问题更多是关于如何使用 CoreData 设置一对多关系。

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

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

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

是否应该先将item完全存入数据库,然后重新抓取并设置关系?

一些代码:

[项目.m]

@interface ITEM :  NSManagedObject  



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

@end

[/item.m]

[类别.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]

我没有实现任何 CoreDataGeneratedAccessor,我假设它们已经创建并隐藏了。

我尝试以两种方式设置关系,一次来自 CATEGORY,一次来自 ITEM IE。 [[自我类别] addItemObject:[自我项目]]; 并且 [[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】:

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

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

您可以重构代码,使其仅使用一个 NSManagedObjectContext 或 merge 将项目放入“主上下文”,然后再为其分配类别。

【讨论】:

这是我逻辑上的失败,谢谢。我必须记住项目的名称,然后在它们合并后再次搜索。然后我设置关系。 我还有另一个后续问题/错误。在我修改类别表中的条目后,代码没有保存。这一切都适用于初始运行,但在重新加载应用程序时没有任何关系。编辑某些内容后,我是否需要在 MOC 上调用 save ? CoreData 是不是看不到自己被修改过重新更新了? 您必须自己保存。而且你必须检查错误,如果我没记错的话,如果出现问题,保存会静默失败。 ios Coredata 模板将其上下文保存在 applicationWillTerminate: 和 applicationDidEnterBackground: 中。但是恕我直言,在完成大量更改后保存是一个好习惯。这样,当应用崩溃时,您不会丢失所有更改。

以上是关于iOS / iPhone CoreData 关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上的 Core Data 中设置新创建的关系?

iphone, 以多对多关系保存数据, 核心数据

iPhone开发——使用CoreData查询相关记录

CoreData 适用于我的模拟器,但不适用于使用 xCode 6 的 iOS 8 Swift 中的 iPhone

iOS:迁移coredata关系时的值表达函数是啥?

何时在 iPhone 开发中使用 CoreData