我应该在哪里存储我的 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 上不起作用