1

我的 XML 导入要求我在插入之前检查现有对象。换句话说,在确定是否保存之前,我需要将每条记录保存在临时托管数据对象中。*** 注意:请参阅此线程中的最后一个答案:

有没有办法在不插入的情况下实例化 NSManagedObject?

我采用了上面链接中最后一个答案的方法,使用 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.....
        }

谢谢

4

3 回答 3

3

听起来您将nil上下文视为另一个托管对象上下文。不是这种情况。当您nil作为上下文传递给initWithEntity:insertIntoManagedObjectContext:您时,您要求不要将创建的托管对象插入任何上下文中。它不会插入到名为 的托管对象上下文中nil。它不会插入到任何托管对象上下文中。

因此,当您询问是否可以从nil上下文中获取许多对象时,答案是“不”。这是因为没有nil上下文。

但是,NSManagedObjects 是对象。您可以将许多对象存储在一个数组中,当您要保存时,只需遍历数组,找到要保存的许多对象,然后仅将它们插入到您的上下文中。

于 2011-03-09T15:29:27.513 回答
1

如果它们不在上下文中,则它们不会被持久化。如果您在创建它们后释放它们,它们将永远消失。

如果要创建关系,则需要将它们插入到 a 中,NSManagedObjectContext然后通过关系加入它们。

从评论更新

除非您通过诸如字典之类的其他机制来保留它们,否则无法检索它们。就我个人而言,我会使用唯一键* 作为键将它们存储在字典中。

*唯一的密钥当然取决于您和您的数据。

于 2011-03-08T08:45:32.650 回答
0

我所做的是使用一个实体的 nil 对象上下文和一个数组来保存所有多表对象,直到我需要保存它们。

谢谢大家。

于 2011-03-10T00:36:59.233 回答