Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何发布预装coreData的应用程序?_Xcode_Swift_Core Data_Osx Yosemite - Fatal编程技术网

Xcode 如何发布预装coreData的应用程序?

Xcode 如何发布预装coreData的应用程序?,xcode,swift,core-data,osx-yosemite,Xcode,Swift,Core Data,Osx Yosemite,我试图找到最好的方法来发布一个带有预加载数据的应用程序。 我有一个应用程序,有两个表。我想用一些数据填充这些表格。问题在于数据不仅仅是文本信息。1实体包含大约40个属性(数字、字符串、可转换数据),因此嵌入到代码中并不是解决方案 感谢您的帮助。当用户首次尝试访问数据时,通过执行提取请求或获取持久存储中对象的计数,运行检查以查看持久存储中是否存在任何对象 如果fetch请求的结果为零,或者fetch请求的对象计数为0,请手动将数据从某个文件(JSON、plist、XML)加载到核心数据中。以下是我

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


感谢您的帮助。

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


如果fetch请求的结果为零,或者fetch请求的对象计数为0,请手动将数据从某个文件(JSON、plist、XML)加载到核心数据中。

以下是我的处理方法:

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

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

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

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

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

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

  • 编写一个非常小的CLI OS X应用程序,支持现有的核心数据堆栈
  • 此CLI在已知位置创建预填充的SQLite文件
  • 作为构建过程的一部分运行此CLI
  • 将创建的SQLite文件作为应用程序包的一部分包括在内
  • 启动时,如果目标SQLite文件不存在(
    NSFileManager
    将告诉您这一点);从应用程序包复制SQLite文件
  • 正常发射

  • 这使得过程可以编写脚本并保持一致。它重用您现有的代码结构来构建预填充的数据库,并使您能够使其保持最新状态。

    这是一个非常糟糕的主意。您正在让用户支付预填充该数据库的费用。@MarcusS.Zarra我认为您在某种程度上夸大了这种方法的缺点。我也更喜欢CLI方法,但对于数据量较小的应用程序来说,这并不是最糟糕的。数据量较小的应用程序很快就会变成数据量较大的应用程序:)@MarcusS.Zarra基于您上次的评论,我想您误解了我。这个初始化数据的过程只发生一次,仅在从应用商店安装应用程序后第一次启动应用程序时发生。任何后续发布都不会产生这种开销,因为加载数据的先决条件是核心数据一开始就没有任何内容。我的观点是,如果你构建了另一个版本的应用程序,添加新字段,更改数据,等等。那么预填充的数据需要再次构建。预填充的几乎是aways的构建需要在某个时间点重新进行,因此应该是构建过程的一部分。编写一个微小的CLI并将其作为构建过程的一部分要比手动进入模拟器并获取SQLite文件好得多。引入人工组件会引入错误。我已经这样做了。但我想找到另一种方法,因为我正在平移以进行更新,我不想再次重写数据库。用户可以写入数据,如果我这样做,输入的所有数据都将丢失。@MarcusS.Zarra Meh。“人工组件”是由开发人员执行的一次性步骤。如果你犯了错误,应用程序将无法运行,你必须去修复它。开发过程中的无数步骤都是如此。@Duncan抱歉,我同意Marcus的观点。构建过程中的人工步骤出错的可能性太大。您应该始终使用外部脚本和
    xcodebuild
    ,或者使用Xcode本身中的生成步骤来自动生成。@duncac它很少停留在一次性完成的状态。迁移到新商店时会发生什么?添加新数据?随着应用程序的成熟,有许多情况会导致数据需要刷新。除非应用程序从未更新过,否则它不会一次完成。当然,这只适用于填充初始数据。如果您需要将新数据与用户可能已更改的数据合并,您需要做一些稍微不同的事情。如果用户能够编辑数据,那么我将在应用程序包中保留“仅准备就绪”数据,并在可写区域中创建一个新存储。然后可以随意更新只读文件。