具有与 CoreData 相同类型的持久性和非持久性对象
Posted
技术标签:
【中文标题】具有与 CoreData 相同类型的持久性和非持久性对象【英文标题】:Having persistent and non persistent objects of the same type with CoreData 【发布时间】:2011-07-17 18:50:42 【问题描述】:我目前正在开发一个使用 CoreData 持久保存一些对象的 iPhone 应用程序。
为了说明我的观点,我想简要介绍一下这个场景:
我有一些从 Internet 查询的数据。我将这些数据保存在一个名为 MyData 的对象中,并在需要的地方使用它。使用数据时,我想永久保存它,因此我将其保存到 MyManagedData 对象。
我真的不喜欢这种保存数据的解决方案。因为我有两个类保存完全相同的数据,但一个由 CoreData 管理。
有没有办法在不将托管对象自动保存到 CoreData 的情况下实例化托管对象?所以我可以只拥有 MyManagedData 对象并只保存一堆?你如何构建这样的东西?
问候
【问题讨论】:
【参考方案1】:一种可行的方法是拥有两个托管对象上下文。您已经在为主要的持久数据使用上下文,因此您可以为从未保存的“临时”数据创建一个新的上下文。
有几篇关于这个主题的文章,例如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]
,因为它仅用于临时数据。
注意:我自己还没有尝试过上述策略,但我相信它是可行的。
注意在一个相关问题上,我还使用了mogenerator,它消除了生成实体类的痛苦(并防止在重新生成实体类时破坏您可能添加到实体类中的自定义代码)。
【讨论】:
【参考方案2】:最简单的解决方案是在保存上下文之前删除不再需要的托管对象。这样,上下文只会将您想要保留的对象写入持久存储。
但是,我不会打扰。我只是告诉上下文在不再需要对象时删除它们,而不用担心它们是否在任何特定时间写入磁盘。如果您的数据太少以至于您可以一次将它们全部保存在内存中,那么将这些对象写入磁盘以稍后删除它们的开销将是微不足道的。
【讨论】:
谢谢。但是为每个可能保存的对象都有一个 NSMangedObject 有时会涉及很多我真的不想处理的样板代码,如果我不需要的话。 与跟踪两组不同对象的开销相比,有些已保存,有些未保存。根据您的姓名和您对使用 Core Data 的描述,我认为您没有正确使用它。我认为你是在浪费时间和精力来节省时间和精力。 这也许是一个好点。我的系统中有一些对象类,我将它们作为参数或返回值从一个对象传递到另一个对象。在某些情况下,我必须创建这些对象并使用它们并释放它们,在另一种情况下,我需要这些对象(或它们包含的数据)并保存它们。最好的方法可能是为这些对象数据提供一个容器来保存它们?或者这是一个错误的用途?如果我自己编写一个 SQLite 包装器,我将实现一个加载器类,它为我提供此类对象中某些数据库条目的数据。 我认为您认为 Core Data 有很多开销,但实际上它没有。它非常轻量级并且优化到几乎不可能使用自定义代码或 SQL 做得更好,除了一些有限的情况。例如。我将 Core Data 用于以前使用数组和字典的东西。为您管理一切更容易。当然,这是因为我对 Core Data 了解透彻。如果你有足够的数据准备使用 SQL,那么如果你有足够的时间来学习它,你就应该使用 Core Data。如果没有,那就使用你现在知道的,以后再升级。以上是关于具有与 CoreData 相同类型的持久性和非持久性对象的主要内容,如果未能解决你的问题,请参考以下文章
JMS学习--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系