我应该在哪里存储我的 Xcode Swift 应用程序的初始数据?

Where should I store the initial data for my Xcode Swift app?

我正在开发闪存卡类型的应用程序。数据是字典数组,应用程序启动时必须存在,即使是第一次启动。

但是,随着时间的推移,应用程序中的数据将需要更新 - 现有记录将被修改或新记录将被添加。我有一个外部 python 脚本,它生成一个 JSON 文件并将其上传到我的网络服务器。我的应用程序需要该文件。

每次启动应用程序时,我的想法是检查网络服务器。如果那里的数据较新,那我就下载下来,保存起来使用。如果没有(或者无法访问网络服务器),我将使用应用程序中已有的数据,这些数据可能是初始数据或之前下载并保存的较新数据。

所以我的问题是:

我在哪里存储初始数据以及我最终将下载的数据存储在哪里?为了避免浪费 space,我宁愿不包含一个 JSON 文件,该文件只读取一次,然后保存到 UserDefaults,然后再也不会引用。

有没有办法使用预先存在的 UserDefaults 启动应用程序? (似乎不太可能。)如果我在我的应用程序中包含一个 JSON 文件,我可以只用我下载的新文件替换该文件的内容吗?还是我需要使用 Core Data?

Is there a way to launch an app with pre-existing UserDefaults? (Seems unlikely.)

其实有这样一种方式(叫做registering defaults),不过没关系。作为字典基础的 JSON 不是用户默认值,永远不会存储在 UserDefaults 中,因此请将其从您的脑海中完全抹去。 UserDefaults 与本文无关。

相反,您可以按照您的建议将 JSON 的初始版本包含在应用程序包中,然后将其复制到启动时的 Documents 目录中 if 不存在此版本或更高版本。 (您可以使用命名方案来跟踪版本控制。)随后,如果您在 Web 上发现更新的版本,您只需从 Documents 中覆盖或删除现有文件并保存更新的文件。

所有这些都假定词典足够小,您可以一次将其全部加载到内存中,因为这就是您在读取 ​​JSON 文件时要做的事情。如果您担心无法以这种方式扩展,并且您需要能够一次仅加载 部分 数据,that 将是使用 SQLite 或(不寒而栗)Core Data 的原因,因为这些方法允许您查询磁盘上的数据库,而无需立即将整个内容加载到内存中。假设您使用了 SQLite。然后你会在你的应用程序包中包含 SQLite 文件的初始版本并将其保存到文档中,否则你会包含一个 JSON 版本并构建初始 SQLite 文件首次启动时进入文档;随后,当您在网上发现修改后的数据时,您将使用SQL命令修改Documents中的SQLite文件。

在您的项目中添加一个只读一次的 json 文件并不是一个坏主意,因为 json 文件将是一个简单的文本文件,不会占用任何大量的 space.

但是因为你想稍后修改 json 文件,更好的方法是在你的应用程序启动时首先将 json 文件从你的应用程序包复制到任何可用的沙箱文件夹(这将允许您稍后修改文件)。

稍后如果网络服务器上有可用数据,您可以检查和修改文件。并稍后阅读文件内容。