NSManagedObject没有插入它:相关很多

时间:2011-03-06 04:25:28

标签: xml core-data import relationship nsmanagedobjectcontext

我的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.....
        }

由于

3 个答案:

答案 0 :(得分:3)

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

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

但是,NSManagedObject是对象。您可以将多个对象存储在一个数组中,当您即将保存时,只需循环遍历该数组,找到您要保存的许多对象,并仅将这些对象插入到您的上下文中。

答案 1 :(得分:1)

如果他们不在上下文中,他们就不会坚持下去。如果你在创建它们后释放它们,它们将永远消失。

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

从评论更新

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

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

答案 2 :(得分:0)

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

感谢All。