当并非所有对象都将被存储时,使用 Core Data 作为模型
Posted
技术标签:
【中文标题】当并非所有对象都将被存储时,使用 Core Data 作为模型【英文标题】:Using Core Data as a model when not all objects will be stored 【发布时间】:2010-08-12 16:44:59 【问题描述】:我正在开发一个从 Web 服务器下载数据的 iPhone 应用程序,我有时(但并非总是)想要缓存这些下载的结果。我正在处理的实体是一个事件。事件以下列方式出现在 UI 中:
作为基于位置的搜索的结果 作为基于关键字的搜索的结果 最喜欢的活动列表只有在第三种情况下才有必要(或希望)将数据存储在本地数据库中。换句话说,我下载了一个事件,只有当用户决定将其添加到他们的收藏夹时,它才会存储在本地。
知道我正在下载的数据是 JSON 格式可能有帮助,也可能没有帮助。
我想使用一致的模型对象来表示事件,但有时它们会存储在数据库中,有时它们不会。我不希望我的视图控制器必须知道或关心对象来自哪里,它们应该能够显示来自本地缓存的事件,或者来自没有任何特殊代码的下载来处理任何一种情况。
因此,我可以使用 NSManagedObject(或其子类)来表示事件吗?如果我不这样做,在我看来,我将处理两个模型对象,一个是我的自定义对象,用于下载和未存储的事件,另一个是存储事件的 NSManagedObject 子类,两者都有相同的属性,但它们是根本不同的东西。
或者,是否有第三种选择,我创建某种装饰器对象(或协议?),它知道如何将来自视图控制器的请求代理到底层数据,有时是 NSManagedObject,有时是从生成的字典JSON?
这里推荐的解决方案是什么?
【问题讨论】:
【参考方案1】:最简单的解决方案是通过NSManagedObject
上的-initWithEntity:insertIntoManagedObjectContext:
方法创建不带NSManagedObjectContext
的NSManagedObject
实例。
当您想要真正持久化对象时,您需要做的就是在实体上设置上下文并保存上下文。
【讨论】:
我没有意识到initWithEntity
可以为对象上下文取 nil 值。很有趣。以上是关于当并非所有对象都将被存储时,使用 Core Data 作为模型的主要内容,如果未能解决你的问题,请参考以下文章