将存储在 sqlite 中的用户数据迁移到应用升级中的核心数据
Posted
技术标签:
【中文标题】将存储在 sqlite 中的用户数据迁移到应用升级中的核心数据【英文标题】:Migrating user data stored in sqlite to core data in app upgrade 【发布时间】:2012-09-21 13:29:37 【问题描述】:我是 Stack Overflow 的新手,并且只编程了一年,所以仍然是这些东西的新手(即,请多多包涵!)。我正在升级在 xcode 3 中创建的旧应用程序,它使用 sqlite 数据库来存储用户生成的数据。升级后的应用程序需要与 iCloud 配合使用,所以我决定切换到 Core Data(因为 sqlite 本身无法与 iCloud 同步)。我在实现核心数据结构方面没有问题,但我的问题是如何让用户保留他们现有的数据。
我已经看过这些主题:How to import a pre-existing sqlite file into Core Data? 和 Need To Populate Core Data From SQLite Database,虽然我可以创建一个实用应用程序来导入现有数据,但这没有用,因为初始应用程序包中没有现有数据,数据由用户存储。
我真的很感谢我能在这方面得到任何帮助,我已经完全把自己绑在了一个大结上!也许我最好完全避免核心数据并找到另一种将 sqlite 数据保存在 iCloud 中的解决方案?
提前致谢!
【问题讨论】:
【参考方案1】:您可以使用核心数据。创建您的核心数据模型和堆栈,您的迁移过程包括从您的 sqlite 数据库中查询数据块以将它们插入到核心数据数据库中。
假设您的 sqlite 中有三个表。人员、车辆和财产。您将在核心数据模式下创建等效实体,然后您必须从这些表中查询信息以将它们插入核心数据。您需要熟悉如何将数据插入核心数据数据库,以及如何在多线程环境中使用它(以避免在迁移过程中锁定应用程序)。
请注意以下几点:
尝试分块保存。不要将所有内容都加载到内存中,而且您必须避免对 NSManagedObjectContext 实例进行大量保存调用。对上下文的每个保存调用都是 IO。根据您的数据使用情况平衡 IO 和内存。 索引现有实体上可以索引的属性。这将帮助您建立关系(如果有) 在开始迁移之前向系统询问时间。使用 UIApplication 的 beginBackgroundTaskWithExpirationHandler: 以确保系统有足够的时间继续迁移(以防用户将应用程序发送到后台)。 不要费心清理 sqlite 数据库。完成后删除数据库文件。这些是我现在可以给你的一些建议。如果我想到更多,我会编辑这篇文章。祝你好运。
【讨论】:
太棒了,这是大量的信息,帮助我指明了正确的方向,感谢!!以上是关于将存储在 sqlite 中的用户数据迁移到应用升级中的核心数据的主要内容,如果未能解决你的问题,请参考以下文章
应用轻量级迁移后,将 ios-add 列添加到 sqlite?
South - 将 django 应用程序从 sqlite 迁移到 mysql