我的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;
}
我要将一个表记录保存到竞赛中的代码:
[self.managedObjectContext insertObject:self.xmlCurrentRecordTempObject];
// Store what we imported already.
if (![self.xmlManagedObjectContext save:&error]) {
...... snip.....
}
由于
答案 0 :(得分:3)
听起来您正在考虑将nil
上下文作为另一个托管对象上下文。不是这种情况。当您将nil
作为上下文传递给initWithEntity:insertIntoManagedObjectContext:
时,您要求创建的托管对象不会插入到任何上下文中。它是 not 插入到名为nil
的托管对象上下文中。它不会插入任何托管对象上下文。
因此,当您询问是否可以从nil
上下文中获取许多对象时,答案是“否”。这是因为没有nil
上下文。
但是,NSManagedObject
是对象。您可以将多个对象存储在一个数组中,当您即将保存时,只需循环遍历该数组,找到您要保存的许多对象,并仅将这些对象插入到您的上下文中。
答案 1 :(得分:1)
如果他们不在上下文中,他们就不会坚持下去。如果你在创建它们后释放它们,它们将永远消失。
如果要创建关系,则需要将它们插入NSManagedObjectContext
,然后通过关系加入它们。
除非您通过其他机制(如字典)保留它们,否则无法检索它们。我个人会使用唯一键*作为键将它们存储在字典中。
*当然,唯一的密钥取决于您和您的数据。
答案 2 :(得分:0)
我所做的是使用一个实体的nil对象上下文和一个数组来保存所有多表对象,直到我需要保存它们。
感谢All。