Core Data Cocoa 错误 1570。不能保存多个实体对象
Posted
技术标签:
【中文标题】Core Data Cocoa 错误 1570。不能保存多个实体对象【英文标题】:Core Data Cocoa error 1570. Can't save more than one entity object 【发布时间】:2013-07-28 04:23:48 【问题描述】:我有一个具有以下接口的 NSManagedObject。
@class Organization, Person;
@interface Assistance : NSManagedObject
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) Organization *organization; // Not optional, 1 to 1
@property (nonatomic, retain) NSSet *persons; // 1 to many
@end
Person 与 Organization 是一对一的关系。 援助与组织具有一对一的关系和与个人的关系是 1-may。
我第一次尝试保存条目时效果很好,但第二次就不行了。
案例场景:我添加了一个日期为 2013-07-26 00:00:00 +0000 的实体,其各自的组织和人员。
我重新启动应用程序。它执行当前日期(7/27)的搜索,但没有找到任何东西。我开始在应用程序上编辑东西,所以它使用 MagicalRecord 的便捷方法 [Assistance createEntity] 创建了一个新实体;我立即设置日期(7/27)和组织。 Person 对象被添加或删除。选择另一个日期时,我尝试保存当前的辅助对象实体,因为这是我自己实现了setCurrentDate方法:
- (void)setCurrentDate:(NSDate *)currentDate
if (assistanceWasChanged)
NSLog(@"> > > Has changed, need to save with Persons %i, org %@, date %@", [self.assistance.persons count], self.organization.name, self.currentDate);
// [[NSManagedObjectContext defaultContext] saveOnlySelfWithCompletion:^(BOOL success, NSError *error) NSLog(@"> > > 01:Assistance saved?"); ];
[[NSManagedObjectContext defaultContext] saveOnlySelfAndWait];
assistanceWasChanged = NO;
_currentDate = currentDate;
[self setCurrentAssistance]; // Tries to find Assistance with new date
但这一次,它不会保存。我收到 Cocoa 错误 1570(未填写所有必填字段):
> > > Has changed, need to save with Persons 1, org MSF, date 2013-07-27 00:00:00 +0000
2013-07-27 20:23:41.017 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Saving <NSManagedObjectContext (0x8d61e50): *** DEFAULT ***> on *** MAIN THREAD ***
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Parents? 0
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Synchronously? 1
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8d61e50) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects
2013-07-27 20:23:41.019 CoreData: sql: BEGIN EXCLUSIVE
2013-07-27 20:23:41.019 CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
2013-07-27 20:23:41.020 CoreData: sql: COMMIT
2013-07-27 20:23:41.021 +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0x6b3a0) Error: <Assistance: 0x9cb16c0> (entity: Assistance; id: 0x9e5ac00 <x-coredata://15A3-4C6D-4025-9131-3D51048/Assistance/p1> ; data:
date = "2013-07-26 00:00:00 +0000";
organization = nil;
persons = "<relationship fault: 0x8d80500 'persons'>";
)
组织在任何时候都是零。此外,从未获取/编辑日期为“2013-07-26”的对象。正如我的日志语句所示,我尝试添加的新对象的日期为“2013-07-27”。 起初我以为 CoreData 有一个指向旧数据的指针,但事实并非如此,第一次插入的日期从未被提取。 (当我重新启动应用程序时,第一个对象(7/26)仍然存在。 万一有所不同,协助实体对象是我的实现文件中的一个属性:
@property (strong, nonatomic) Assistance *assistance;
我是否遗漏了有关 Core Data 的某些内容? 为什么在保存新实体对象时访问第一个插入的对象?为什么组织为零?
【问题讨论】:
也许显示您创建新对象的代码,包括您设置组织的部分? 还有很多其他地方可能会出错。这里的主要问题是我不确定你是否理解上下文的概念。对象与上下文相关联,您需要保存上下文以使数据持久保存,然后您可以稍后搜索它。我在这段代码中没有看到任何“错误”,但我也觉得我也没有全貌来查明问题。 @casademora 谢谢扫罗!我想相信我理解上下文的概念,但我会再看一次。我的问题是我的 3 个实体中有 2 个的关系多重性错误。 【参考方案1】:您似乎没有创建新的organisation
。相反,您将新的Assistance
对象链接到现有的organisation
。因为关系是1 to 1
,这意味着旧的Assistance
对象与organisation
的关系已损坏。这是由 Core Data 自动完成的,以保持您设置的配置的完整性。
因此,要么创建一个新的organisation
对象,要么更改关系多重性。
【讨论】:
我知道问题出在哪里,但你是对的。我需要改变关系的多样性。我只关注“援助”中的关系,其中援助与组织的关系是“对一个”(这是我关心的关系),但组织与援助的关系是“对多”(核心数据也关心这个关系,即使我没有)以上是关于Core Data Cocoa 错误 1570。不能保存多个实体对象的主要内容,如果未能解决你的问题,请参考以下文章
[Cocoa]深入浅出 Cocoa 之 Core Data- 框架详解
如何在 Cocoa 文本输入系统中使用 Core Data?