背景
我通过Windows窗体(C#(、Android(Java和Kotlin(、HTML5 Web应用程序、ElectronJS(在Linux、Mac和Win10上运行(甚至作为UWP(通用Windows平台(应用程序编写了一个特定的应用程序。
所有数据都使用JSON文件
所有这些应用程序都使用完全相同的JSON格式数据进行用户设置。这意味着我可以通过相同的文件和文件格式在所有平台上共享数据。在Android上,将文件保存在UserPrefs(为用户提供安全和备份(中还有一个额外的好处。
问题我也将该应用程序编写为iPhone/iPad应用程序(Swift(,但我找不到处理JSON文件存储的正确方法
问题是与将JSON反序列化到我的业务对象无关。这一切都很好。然而,我不确定:
- 文件应存储在iPhone/iPad系统的何处
- 你能以某种用户偏好或appdata保存文件吗位置
- 如何打开文件进行读/写和读/写数据?(Swift(
- 我如何才能更好地理解可供阅读和写作的路径文件
我到处找这个答案。你能给我指一下官方文件、一本书、一个StackOverflow项目或其他能清楚解释这一点的东西吗?(希望有Swift的例子。(
请参阅iOS存储最佳实践视频和文件系统基础文档。这应该会让你继续前进。
简而言之,应用程序数据通常存储在"应用程序支持目录"中,暴露给用户的文档(例如Files应用程序(存储在"文档"文件夹中,可以轻松重新检索的下载存储在"缓存"文件夹中。从技术上讲,您可以使用UserDefaults
来存储这类应用程序数据,但它实际上并非用于此目的。
在处理JSON时,通常不会重新打开文件进行"读/写"。将该文件读取到Data
中,并将JSON反序列化到模型对象中。
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("appdata.json")
let data = try Data(contentsOf: fileURL)
let appData = try JSONDecoder().decode(AppData.self, from: data)
// do something with appData
} catch {
print(error)
}
当您想要更新时,您可以将模型对象序列化为包含JSON的Data
,然后将其写入文件,替换该文件。
do {
let fileURL = try FileManager.default
.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("appdata.json")
let data = try JSONEncoder().encode(appData)
try data.write(to: fileURL)
} catch {
print(error)
}
显然,这假设AppData
类型(或您所称的任何类型(符合Codable
,但您说您熟悉JSON的序列化。有关详细信息,请参阅编码和解码自定义类型。