我一直在看NSIncrementalStore
突然出现,因为我一直在研究使用核心数据与网络服务互动的最佳方式。
在阅读an article by Drew Crawford,a programming guide,a class reference and this tutorial后,我几次仍在努力了解NSIncremental
商店是什么,为什么以及何时你会用它。
有人可以解释一下吗?
修改
在阅读了mundi的答案后,我可以看到一些需要进一步的背景。我正在研究将核心数据与我正在构建的Web服务结合使用。我试图找到在设备本地存储用户信息的最佳方法,并在有连接时发布到Web服务。我缺乏对核心数据的了解促使我进行了研究,但我无法完全理解NSIncrementalStore
的有用性。
答案 0 :(得分:34)
注意:当我在2012年写这篇文章并且细节已经改变时,这个API是最前沿的。如果您愿意,请随时更新。我目前没有参与任何Cocoa / ObjC项目,所以不幸的是,我不是一个保持最新状态的好人。似乎整体要点是正确的。
Core Data提供了一组有助于管理对象持久性的工具,即能够从某种存储中保存然后获取对象集(NSManagedObject
)。
使用Core Data对象时,可以使用NSManagedObjectContext
来获取NSPersistentStoreCoordinator
。 PSC反过来与一个或多个NSPersistentStore
子类进行对话,这些子类处理商店的实际操作。 (想想对数据库的创建/读取/更新/删除。)
Core Data支持两种主要类型的商店:NSPersistentStore
和NSAtomicStore
。持久性存储可以被认为是一个数据库:您可以从中逐步保存,更新和获取任意记录集。原子库是对象图的“全部或全部”表示。它旨在成为结构化文件的内存表示。
Core Data附带的商店类型是:
NSSQLLiteStoreType
(NSPersistentStore
)NSInMemoryStoreType
(NSPersistentStore
)NSXMLStoreType
(NSAtomicStore
)NSBinaryStoreType
(NSAtomicStore
) NSPersistentStore
进行子类化,所以直到现在,还没有办法创建自己的非原子存储后端。也就是说,如果你想要持久地查询你的对象的表示而不是一个大块(“加载整个图形”,“保存整个图形”),你就不幸了。直到iOS5引入NSIncrementalStore
。
NSIncrementalStore
是一个抽象类(来自NSPersistentStore
),它实现的方法是在您控制的数据存储和Core Data世界之间提供适配器。您可以使用它来包装远程API,或者如果您如此倾向,可以包装NULevelDB或NanoStore之类的内容(虽然我不确定您为什么这样做)。
答案 1 :(得分:9)
您可以使用NSIncrementalStore
通过Core Data访问远程服务器。您不必读取和写入本地文件,而是将请求推送到服务器并获得回复,然后将其推送到Core Data。同样用于保存等
但请注意,这不是一件容易的事。这是一个非常强大的功能,但除非你是核心数据使用方面的专家,否则我会强烈反对它,因为除非你对Core Data与存储层的交互方式有很多了解,否则有很多机会自己动手。的工作原理。
如果使用uploaded
解决了您的问题,请改为执行此操作。
答案 2 :(得分:5)
简而言之,如果您将SQLite存储与Core Data一起使用,那么您已经在使用增量存储。增量存储的所有好处(即主要不必将整个存储加载到内存中)已经可供您使用。
至于NSIncrementalStore
API的具体应用,我建议您首先确定要解决的问题。如果您需要此API,则将由您的编程任务的特定需求决定。
编辑以回复问题编辑
我会这样做:在设备上的Core Data实体中,您可以拥有属性BOOL uploaded
。当Web服务可用时,启动上载并提取所有不是uploaded
的对象。
要上传,请将您的对象转换为NSArray
和NSDictionary
,或者转换为JSON格式并将POST
转换为您的网站。当网站响应它保存数据时,将所有对象标记为uploaded
。