【问题标题】:How to release an app with preloaded coreData ? [duplicate]如何发布带有预加载 coreData 的应用程序? [复制]
【发布时间】:2015-05-14 13:30:56
【问题描述】:

我试图找到发布带有一些预加载数据的应用的最佳方式。 我有一个有 2 个表的应用程序。我想用一些数据填充这些表。问题是数据不仅仅是文本信息。 1 个实体包含大约 40 个属性(数字、字符串、可转换数据),因此将其嵌入代码中不是解决方案。

感谢您的帮助。

【问题讨论】:

    标签: xcode swift core-data osx-yosemite


    【解决方案1】:
    1. 编写一个非常小的 CLI OS X 应用程序来支持您现有的 Core Data 堆栈。
    2. 此 CLI 在已知位置创建一个预填充的 SQLite 文件。
    3. 将此 CLI 作为构建过程的一部分运行
    4. 将创建的 SQLite 文件包含在您的应用程序包中
    5. 启动时,如果目标 SQLite 文件不存在(NSFileManager 会告诉你);从您的应用程序包中复制 SQLite 文件。
    6. 正常启动。

    这使得程序可编写脚本且一致。它重用您现有的代码结构来构建预先填充的数据库,并让您保持最新状态。

    【讨论】:

    • 当然,这只适用于填充初始数据。如果您需要将新数据与可能已被用户更改的数据合并,您将需要做一些稍微不同的事情。
    • 如果用户将能够编辑数据,那么我会将“仅就绪”数据保留在应用程序包中,并在可写区域中创建一个新存储。那么只读就可以随意更新了。
    【解决方案2】:

    我是这样处理的:

    我使用默认设置,其中核心数据的后备存储是一个 SQL 文件。

    我将我的应用设置为使用应用文档目录中的 SQL 文件设置持久存储协调器。

    我在模拟器上构建我预先填充的核心数据数据库。

    然后我转到 sim 上的应用程序文档目录并将 sql 文件复制到应用程序的包中。

    在应用程序委托中我的应用程序的 didFinishLaunching 方法的开头,我检查了核心数据数据库的 sql 文件是否存在于文档目录中。如果没有,我将它从捆绑包中复制到文档目录中。

    然后我调用创建持久存储协调器的代码,它需要文档目录中的 sql 文件。首次启动时,这是从捆绑包中复制的初始文件。在后续启动时,文档目录中的工作文件包含当前数据。

    【讨论】:

    • 编写一个小型 CLI 并将其作为构建过程的一部分,比手动进入模拟器并获取 SQLite 文件要好得多。引入人工组件会引入错误。
    • 我已经这样做了。但是我想找到另一种方法来做到这一点,因为我正在平移进行更新,并且我不想再次重写数据库。用户可以写入数据,如果我这样做,输入的所有数据都将丢失。
    • @MarcusS.Zarra Meh。 “人工组件”是由开发人员执行的一次性完成的步骤。如果你做错了,应用程序将无法运行,你必须去修复它。开发过程中的无数步骤都是如此。
    • @DuncanC 抱歉,我同意 Marcus 的观点。构建过程中的人为步骤出错的可能性太大。您应该始终使用外部脚本和xcodebuild 或在 Xcode 本身中使用构建步骤来自动化您的构建。
    • @DuncanC 它很少会一次完成。当您迁移到新商店时会发生什么?添加新数据?随着应用程序的成熟,有多种情况会导致需要刷新数据。除非应用程序永远不会更新,否则它永远不会一次完成。
    【解决方案3】:

    当用户第一次尝试访问数据时,通过执行获取请求或获取持久存储中的对象计数来运行检查以查看持久存储中是否有任何对象。

    如果 fetch 请求的结果为 nil,或者 fetch 请求的对象数为 0,则手动将某个文件(JSON、plist、XML)中的数据加载到 Core Data 中。

    【讨论】:

    • 这是一个非常糟糕的主意。您正在让用户支付预填充该数据库的费用。
    • @MarcusS.Zarra 我认为你夸大了这种方法的坏处。我也更喜欢 CLI 方法,但对于具有少量数据的应用程序来说,这并没有更糟。
    • 从少量数据开始的应用很快就会变成拥有大量数据的应用 :)
    • @MarcusS.Zarra 根据您的最后评论,我认为您误解了我的意思。这个初始化数据的过程只发生一次,仅在您从应用商店安装应用程序后第一次启动应用程序时发生。任何后续启动都不会产生这种开销,因为这种数据加载的前提条件是核心数据首先内部没有任何内容。
    • 我的观点是,如果您构建了另一个版本的应用程序、添加新字段、更改数据等,那么再次需要构建预先填充的数据。需要在某个时间点重做这个预填充的几乎客场的构建,因此应该是构建过程的一部分。
    猜你喜欢
    • 2015-04-01
    • 2012-04-12
    • 2011-06-16
    • 2022-06-28
    • 1970-01-01
    • 2016-08-30
    • 2014-11-12
    • 2017-12-12
    相关资源
    最近更新 更多