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 上下文。

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

【讨论】:

谢谢詹姆斯。这是我在发现上面的 nil 对象技术以及我现在的应用程序的正确答案之前的第一个想法。【参考方案2】:

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

如果你想创建一个关系,你需要将它们插入到NSManagedObjectContext,然后通过关系加入它们。

从 cmets 更新

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

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

【讨论】:

谢谢,马库斯。我的应用程序有一个上下文。在此之前,在启动时,应用程序将删除实体中的所有对象,并使用插入连接到关系将数据导入到两个表中。现在的问题是我需要进行合并,我需要将当前记录存储在一个对象中,并在提交之前搜索现有记录。如此张贴链接所示***.com/questions/3868514/… 只是为了澄清一下:我有一个称为事件的实体和一个相关的许多实体,称为类别。现在我将事件存储在一个临时对象中(没有上下文),直到我准备好提交它。如果应该保存记录,我使用 insertObject 分配上下文。我现在还将所有类别导入到临时对象中。在没有上下文的情况下检索它们的最佳方法是什么?【参考方案3】:

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

谢谢大家。

【讨论】:

以上是关于NSManagedObject 不插入它:相关的很多的主要内容,如果未能解决你的问题,请参考以下文章

应更新数据时,NSManagedObject 的删除/插入与更新

将获取的 NSManagedObject 分配给属性

NSManagedObject changedValues 不正确

插入的 NSManagedObject 无法保存时会发生啥情况?

具有强制关系的 NSManagedObject

在插入之前分配 NSManagedObject 属性不会坚持