我目前正在开发一款iPhone应用程序,该应用程序使用CoreData持久保存一些对象。
为了明确我的观点,我想简要介绍一下这个场景:
我有一些数据,我从互联网上查询。我将这些数据保存在一个名为MyData的对象中,并在需要它的地方使用它。当使用数据时,我想永久保存它,所以我将它保存到MyManagedData对象。
我真的不喜欢这种保存数据的解决方案。因为我有两个类保存完全相同的数据,但是一个由CoreData管理。
有没有办法实例化托管对象而不自动将它们保存到CoreData?所以我可以只拥有MyManagedData对象并保存它们中的一大堆?你是如何构建这样的东西的?
问候
答案 0 :(得分:2)
一种可行的方法是拥有两个托管对象上下文。您已经在使用主要持久数据的上下文,因此您可以为您从未保存的“临时”数据创建新的上下文。
关于这个主题有一些文章,例如http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/。
我一直在使用InnerBand来帮助CoreData。它简化了我的代码并且没有妨碍它。
如果您使用InnerBand,则创建用于存储瞬态实体(未保存)的临时上下文/存储应该只是执行以下操作:
// note - not calling [CoreDataStore mainStore] here --
// we use that for persisted main data
self.temporaryStore = [CoreDataStore createStore];
// and then create temporary entities like so:
MyEntityClass *myEntity = [MyEntity createInStore:self.temporaryStore];
显然,你永远不应该调用[self.temporaryStore save]
,因为它只适用于瞬态数据。
注意:我自己还没有尝试过上述策略,但我相信它是可行的。
N.B。在一个相关的问题上,我也使用了mogenerator,它可以减少生成实体类的痛苦(并且可以防止在重新生成实体类时可能已经添加到实体类中的自定义代码的破坏)。
答案 1 :(得分:0)
最简单的解决方案是在保存上下文之前删除不再需要的托管对象。这样,上下文只会将您要保留的对象写入持久性存储。
但是,我不会打扰。我只是告诉上下文删除不再需要的对象,而不用担心它们是否在任何特定时间写入磁盘。如果你有这么少的数据,你可以将它全部保存在内存中,那么将这些对象写入磁盘只是为了以后删除它们的开销将是微不足道的。