从UIManagedDocument到传统的Core Data堆栈

时间:2012-09-03 18:44:34

标签: ios core-data

我使用UIManagedDocument创建了一个新的App。在我的设备上一切都很好,我得到了很多不好的评级,因为在其他设备上有问题:( 经过大量的阅读和测试,我决定回到传统的核心数据堆栈。 但是,使用app的最佳方法是什么,已经在应用商店中了? 我该如何构建此更新?我该怎么办呢?

谢谢, 斯蒂芬

2 个答案:

答案 0 :(得分:2)

UIManagedDocument是一种特殊的文档,一种UIDocument子类,使用Core Data Framework存储其数据。因此,它结合了文档架构和核心数据功能的强大功能。

您可以从基于iOS的基于文档的应用程序编程指南中阅读有关基于文档的体系结构的更多信息,我建议使用iOS5会话视频在iCloud中存储WWDC2011文档。我还推荐Stanford CS193P:iPad和iPhone App Development(2011年秋季)第13讲。

调用saveToURL时创建的内容:forSaveOperation:completionHandler:是UIManagedDocument和UIDocument的实现细节,您不应该担心或依赖它。但是,在当前实现中,正在创建包含sqlite数据库文件的文件夹。

没有。所有实体都将包含在单个数据库文件中,通常也称为持久性存储。可以使用多个持久性存储,但这些是更高级的用例,而UIManagedDocument当前使用一个。

UIManagedDocument的上下文是指来自底层Core Data Framework的NSManagedObjectContext。 UIManagedDocument实际上并行操作其中两个以将IO操作分离到后台线程。当涉及到上下文本身的性质时,这里引用了核心数据编程指南:

您可以将托管对象上下文视为智能便笺簿。从持久性存储中获取对象时,将临时副本放在便笺簿上,它们形成对象图(或对象图的集合)。然后,您可以根据需要修改这些对象。但是,除非您实际保存这些更改,否则持久存储将保持不变。

但是,看看我上面发布的讲座和其他材料以了解所使用的技术以及它们作为开发人员在不同情况下的潜在价值,这是一个好主意。

答案 1 :(得分:2)

我认为您最好用UIManagedDocument确定问题并解决它们。

但是,如果你想去普通的MOC,你只需要担心一些事情。最大的问题是UIMD将东西存储在文件包中,根据您的选择,您可能不得不担心更改日志。

最后,如果你想要一个sqlite文件,并希望减少混淆的可能性,你有一个只打开你的UIManagedDocument的类,并获取每个对象,然后在单个sqlite文件中复制它为你的新的MOC。

现在,您不应该需要不同的对象模型,因此不应该有任何迁移问题。

然后,只需删除包含UIManagedDocument的文件包,只使用您的单个文件sqlite store。

基本上,在启动时,您尝试打开UIManagedDocument。如果它打开,请加载每个对象并将其复制到新数据库中。然后删除它。

从此,你应该好好去。

但请注意,您现在可能会遇到一些UI延迟,因为所有数据库IO都发生在主UI线程上。要解决此问题,您可能需要使用单独的MOC,并通过正常的COreData通知机制协调更改。有大量的文档,示例和教程。

修改

  

感谢您的回答。我对这些问题的疑问是,我不是   能够重现它们。我的所有设备都运行正常。但我得到了一个   很多邮件,关于这样的问题: - 重复的条目 - 没有数据   停止并重新启动应用程序后 - 有人说,该应用程序正常工作   好几天并停止工作(没有新数据)。这些都是   奇怪的事情,这不会发生在我的设备上。所以对我来说最好   方式是回到平原MOC。我的数据库没有多少用户生成   数据,所有数据都是从Web服务加载的,所以没问题   删除数据并开始使用新数据库。 - Urkman

重复条目。那听起来像是与临时/永久ID相关的错误。关于这一点有很多帖子。这是一个:Core Data could not fullfil fault for object after obtainPermanantIDs

不保存。听起来你没有为UIManagedDocument使用正确的API。您需要确保不直接保存MOC,并使用撤消管理器或调用updateChangeCount:通知UIManagedDocument它具有您要保存的脏数据。同样,关于这一点的很多帖子也是如此。搜索updateChangeCount

但是,您最了解自己的应用,使用普通核心数据可能会更好更容易。

请记住,如果您从网上进行大量导入,使用单独的MOC,并让您的主要MOC观看DidSave通知,以使用新导入的数据更新自己。