如何不保留从 NSManagedObjectContext 检索到的 NSManagedObjects

Posted

技术标签:

【中文标题】如何不保留从 NSManagedObjectContext 检索到的 NSManagedObjects【英文标题】:How to not persist NSManagedObjects retrieved from NSManagedObjectContext 【发布时间】:2010-04-20 16:40:13 【问题描述】:

我解析一个包含书籍的 xml 文件,对于我去的每个新节点:

Book *book = (Book*)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:managedObjectContext];

为了获得我的核心数据书实体的 NSManagedObject,然后我继续用数据填充托管书对象,将其添加到数组中,冲洗,重复。

完成后,我将图书列表呈现给用户。 我还没有执行保存:

NSError *error;
if (![managedObjectContext save:&error]) 
    NSLog(@"%@", [error domain]);

用户现在选择了其中一本书,这本我想坚持,但只有这本,其他所有的书我都不再感兴趣了。 图书实体没有/或属于任何关系。它只是一个“单一”实体。

如果我拉动“保存杆”,每个 Book 对象都将被保留,我将不得不删除除我想要的之外的所有内容。

我将如何解决这个挑战,我似乎真的无法在核心数据编程指南中找到那个特定的用例,这也让我有些烦恼,我是否违背了最佳实践?

感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

是的,您违反了最佳做法。在那个用例中,如果您真的不想保存对象,请将它们保持在中间格式,并且只为您想要持久的对象创建一个 Core Data 对象。然而,这似乎是完全错误的。

保存其他书籍有什么害处?唯一的一次会被使用吗?

根据您提供的少量信息,您似乎需要重新考虑解决问题的方法。

更新

从上下文中删除未保存的对象的开销非常小,是的,这是给定参数的最佳解决方案。我问了其他问题,看看是否有更清洁的整体解决方案,而不是构建对象只是为了扔掉它们。不过听起来你已经走上了这条路。

【讨论】:

嗨,马库斯,谢谢。我可以看到没有太多信息可以使用。我对构建中间对象的主要不满是我必须构建 X 实现。在某些用例中,我会自动将一些书籍添加到持久存储中,其中将添加许多书籍,以及像上面这样的情况,应该只保留一本。我还必须维护 Book 和 tempBook 并“手动”将值从一个填充到另一个,据我所知,没有“将值从 NSObject 复制到 NSManagedObject”。 Core Data 的速度肯定足够快,可以让事情变得非常“干净”。 字符不足。是的,书籍大多只使用一次。我还有遵循上述用例的“书籍收藏”实体(不包含实际书籍,只包含足够的信息来检索一组书籍),我有行为方式非常相似的作者实体和出版商实体。使用 Core Data 和 NSPredicate,我可以让事情变得非常透明,而且开销几乎不存在。 我找到了这个:***.com/questions/1619911/… 我再次浏览了文档,它指出将 deleteObject:Book 消息发送到尚未保存的书,开销很小,因为它只是删除了从上下文中预订,无需与商店互动。 嗨,Marcus,你是对的,我确实觉得构建 50 个核心数据实体只是在保存之前删除其中的 49 个有点不安。我实际上已经思考了几天了,中间解决方案似乎更正确。我认为,如果我直接解析为 NSDictionary 并将其用作视图的数据,那么使用 setValuesForKeyUsingDictionay 将单个字典值迁移到新的 ManagedObject 是相当小的开销。如果我在我的实体中命名我的变量,就像在 XML 中一样,我可以从 XML->Dictionary->Entity 开始,而无需手动输入密钥字符串:)

以上是关于如何不保留从 NSManagedObjectContext 检索到的 NSManagedObjects的主要内容,如果未能解决你的问题,请参考以下文章

如何取消 AFdownloadrequest 操作而不保留以前的进度(删除临时文件) iOS

ios核心数据回滚

在 Kotlin Native 中,如何在不使用 C 指针的情况下将对象保留在单独的线程中,并从任何其他线程中改变其状态?

如何从iOS中保留后退图标的LeftNavigation Bar按钮中删除后退文本[重复]

如何读写保留类

Photon我如何从客户端隐藏开始游戏按钮但为主机保留它