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

Posted

技术标签:

【中文标题】我应该在哪里存储我的 Xcode Swift 应用程序的初始数据?【英文标题】:Where should I store the initial data for my Xcode Swift app? 【发布时间】:2019-06-09 18:11:21 【问题描述】:

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

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

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

所以我的问题是:

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

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

【问题讨论】:

【参考方案1】:

有没有办法使用预先存在的 UserDefaults 启动应用程序? (似乎不太可能。)

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

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

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

【讨论】:

谢谢。奇怪的是,无论是我的 JSON 文件(大约 100KB)还是 SQL,最终结果都会有两个版本:原始版本和 Documents 目录中的版本,可能相同,也可能是更新版本。是的,它很小,但仍然是多余的。感谢您的回答和完整的解释。 “不管是我的 JSON 文件(大约 100KB)还是 SQL,最终的结果是会有两个版本,这似乎很奇怪”这对我来说似乎并不奇怪。 :) 您无法更改应用程序包内的任何内容,但您需要在首次下载应用程序时随身携带文件的初始版本,那么您还能做什么?我想您可以使用 ODR 将初始 JSON 文件单独下载,但是对于 100KB 来说这似乎不值得。【参考方案2】:

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

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

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

【讨论】:

好像和我说的一样。

以上是关于我应该在哪里存储我的 Xcode Swift 应用程序的初始数据?的主要内容,如果未能解决你的问题,请参考以下文章

锁定方向在 ipad ios 8 swift xcode 6.2 上不起作用

在我的 OpenGL C++ 项目中究竟应该在哪里添加我的 BMP 文件?在 Mac 上使用 Xcode

在Swift上存储API密钥的位置?

如何使用xcode开发ios应用程序时读取csv文件

我应该在哪里存储我的应用程序的“激活”密钥?

Xcode 7 Swift 2 提示用户在你的应用中评价你的 iOS 应用