我应该在哪里存储我的 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 文件从你的应用程序包复制到任何可用的沙箱文件夹(这将允许您稍后修改文件)。
稍后如果网络服务器上有可用数据,您可以检查和修改文件。并稍后阅读文件内容。
我正在开发闪存卡类型的应用程序。数据是字典数组,应用程序启动时必须存在,即使是第一次启动。
但是,随着时间的推移,应用程序中的数据将需要更新 - 现有记录将被修改或新记录将被添加。我有一个外部 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 文件从你的应用程序包复制到任何可用的沙箱文件夹(这将允许您稍后修改文件)。
稍后如果网络服务器上有可用数据,您可以检查和修改文件。并稍后阅读文件内容。