NSManagedObject 不插入它:相关的很多
Posted
技术标签:
【中文标题】NSManagedObject 不插入它:相关的很多【英文标题】:NSManagedObject Without Inserting It: Related Many 【发布时间】:2011-03-06 04:25:27 【问题描述】:我的 XML 导入要求我在插入之前检查现有对象。换句话说,在确定是否保存之前,我需要将每条记录保存在临时托管数据对象中。 *** 注意:请参考本帖最后一个答案:
Is there a way to instantiate a NSManagedObject without inserting it?
我采用了上面链接中最后一个答案的方法,使用 insertIntoManagedObjectContext:nil 将传入的一条记录放入没有上下文的临时对象中。
在我的导入中,我有两个表:一个表记录和紧随其后的多个相关多记录。除了我有相关的许多记录之外,这很好用。
现在我也用 nil 将多表记录插入到它们自己的托管对象中。问题是当我要保存一条记录时,我还创建了多个相关的许多对象。如何保存许多记录?我可以从零上下文中获取它们并循环它们吗?
以下是新记录开始的代码:
// Incoming record is for the one table.
if ([elementName isEqualToString: self.xmlRecordTagDelimiter])
NSEntityDescription *entity = [NSEntityDescription entityForName:self.xmlEntityName inManagedObjectContext:xmlManagedObjectContext];
self.xmlCurrentRecordTempObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
thisTagIsForManyTable = NO;
// Incoming record is for the many table.
if ([elementName isEqualToString: self.xmlManyRecordTagDelimiter])
NSEntityDescription *entity = [NSEntityDescription entityForName:self.xmlRelatedManyEntityName inManagedObjectContext:xmlManagedObjectContext];
self.xmlCurrentManyRecordTempObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
thisTagIsForManyTable = YES;
以及我即将将单表记录保存到 contect 中的代码:
[self.managedObjectContext insertObject:self.xmlCurrentRecordTempObject];
// Store what we imported already.
if (![self.xmlManagedObjectContext save:&error])
...... snip.....
谢谢
【问题讨论】:
听起来你的数据模型可能不像你需要的那样设置。听起来你用 SQL 术语来思考 Core Data,这会导致悲伤。 【参考方案1】:听起来您将nil
上下文视为另一个托管对象上下文。不是这种情况。当您将nil
作为上下文传递给initWithEntity:insertIntoManagedObjectContext:
时,您要求创建的托管对象不要插入到any 上下文中。它不插入到名为nil
的托管对象上下文中。它不会插入到任何托管对象上下文中。
因此,当您询问是否可以从 nil
上下文中获取许多对象时,答案是“不”。这是因为没有nil
上下文。
但是,NSManagedObject
s 是对象。您可以将许多对象存储在一个数组中,当您要保存时,只需遍历数组,找到要保存的许多对象,然后仅将它们插入到您的上下文中。
【讨论】:
谢谢詹姆斯。这是我在发现上面的 nil 对象技术以及我现在的应用程序的正确答案之前的第一个想法。【参考方案2】:如果它们不在上下文中,则它们不会被持久化。如果您在创建它们后释放它们,它们将永远消失。
如果你想创建一个关系,你需要将它们插入到NSManagedObjectContext
,然后通过关系加入它们。
从 cmets 更新
除非您通过某种其他机制(例如字典)保留它们,否则无法检索它们。就我个人而言,我会使用唯一键* 作为键将它们存储在字典中。
*唯一的密钥当然取决于您和您的数据。
【讨论】:
谢谢,马库斯。我的应用程序有一个上下文。在此之前,在启动时,应用程序将删除实体中的所有对象,并使用插入连接到关系将数据导入到两个表中。现在的问题是我需要进行合并,我需要将当前记录存储在一个对象中,并在提交之前搜索现有记录。如此张贴链接所示***.com/questions/3868514/… 只是为了澄清一下:我有一个称为事件的实体和一个相关的许多实体,称为类别。现在我将事件存储在一个临时对象中(没有上下文),直到我准备好提交它。如果应该保存记录,我使用 insertObject 分配上下文。我现在还将所有类别导入到临时对象中。在没有上下文的情况下检索它们的最佳方法是什么?【参考方案3】:我所做的是使用一个实体的 nil 对象上下文和一个数组来保存所有多表对象,直到我需要保存它们。
谢谢大家。
【讨论】:
以上是关于NSManagedObject 不插入它:相关的很多的主要内容,如果未能解决你的问题,请参考以下文章
应更新数据时,NSManagedObject 的删除/插入与更新
NSManagedObject changedValues 不正确