1

所以我在 iOS 中开发这个应用程序,它在底部使用 sqlite。我想实现一个导出/导入功能,基本上将 Core Data 创建的 .sqlite 文件复制到用户可以通过 iTunes 访问的 Documents 目录。(导入功能显然会反过来工作。)

我想听听一些赞成和反对的论点。让用户获取 .sqlite 文件让我的数据模型感到兴奋。不是说它是商业机密,而是无论如何......数据库中有很多关系,因此将其导出到制表符分隔的文件(例如)并不方便。

我还看到导入函数和 .sqlite 文件可能存在问题。如果 .sqlite 是从较旧的数据模型创建的会怎样。如果用户以某种方式手动更新 .sqlite 以使数据模型无效怎么办。我想我必须在导入功能中做很多验证。

有什么建议么?

4

2 回答 2

2

Don't worry about your data model. Anyone who wants to know what it looks like can find out anyway. Using an app like iExplorer will let them find out all kinds of things about your app without even needing to jailbreak the phone-- including SQLite files that are not available via iTunes and the Core Data model file itself. The details of your data model are already not going to be secure.

As for different versions-- Core Data includes a migration system that detects version conflicts and offers various migration options to update a data store to the latest version. As long as you're using model migration techniques when updating the model, you won't have any problems with the user copying an old version in-- you'll just end up migrating it as if the user had just upgraded to the new version of the app.

于 2013-02-23T17:51:26.937 回答
0

我在raywanderlich.com上关注了一篇文章,但它使用电子邮件进行导入和导出。

我实际上通过压缩我的 .sqlite 文件并使用 .abc 重命名文件的扩展名来实现导出(使用您的应用程序独有的扩展名)。通过这种方式,用户不知道扩展名,因此通过编辑此文件而损坏的机会可能很低。对于导入,我只需解压缩文件并替换现有模型。注意这里我只是用导入的文件替换我现有的数据。我在一个应用程序中使用过它。并且没有抱怨。如果扩展名未知,人们很少编辑。

关于旧数据模型,AFAIK 如果您已经处理了核心数据迁移,则应将旧模型迁移到新模型。

关于在导入期间验证文件,我认为您无法验证 .sqlite 文件?我的意思是验证,您需要打开 .sqlite 文件并读取它,并且要读取它,它必须与架构匹配。如果它已损坏,它将不匹配并且应用程序将崩溃。您所能做的就是捕获异常并抛出错误消息。

另一种方式

  1. 将 .sqlite 文件重命名为 .db 之类的文件,因此用户可能不会尝试使用任何 .sqlite 查看器打开它。
  2. 导出为 xml 或 json。通过这种方式,您可以验证导入文件,如果您不只是在导入期间替换现有数据,这将很容易。

优点 1. 简单的方法,您不需要任何压缩库或任何额外的方法来转换为 xml 或 json。

缺点

  1. 而且,如果您不只是在导入期间替换现有数据,那么您必须做很多事情。您必须将此 .sqlite 中的所有实体复制到另一个实体。在这种情况下,我只需将数据导入 json 并重命名文件扩展名。在导入期间,我只是解析 json 并创建/更新托管对象上下文。在这个 json 案例中,我将创建 UUID 来唯一标识每条记录。

核心数据生成的 .sqlite 不是普通的 .sqlite 文件,所以如果用户尝试使用 sqllite 查看器打开它,会有些意外。

一旦文件退出应用程序。我们无法控制它的使用方式。如果用户导入损坏的文件,我们所能做的就是抛出一些错误消息。

希望这可以帮助。

于 2013-02-23T17:49:32.083 回答