如何在Swift应用程序中保存本地数据?
我目前正在使用Swift开发的iOS应用程序,我需要在设备上存储一些用户创build的内容,但似乎无法find在设备上存储/接收用户内容的简单而快速的方法。
有人可以解释如何存储和访问本地存储?
这个想法是在用户执行一个动作时存储数据,并在应用程序启动时接收数据。
如果你只是存储两个string,最简单的解决scheme是NSUserDefaults
,在Swift 3中这个类已经被重命名为UserDefaults
。
最好将密钥存储在全球的某个地方,以便您可以在代码中的其他地方重复使用它们。
struct defaultsKeys { static let keyOne = "firstStringKey" static let keyTwo = "secondStringKey" }
Swift 2.0
// Setting let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne) defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo) // Getting let defaults = NSUserDefaults.standardUserDefaults() if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) { print(stringOne) // Some String Value } if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) { print(stringTwo) // Another String Value }
Swift 3.0
// Setting let defaults = UserDefaults.standard defaults.set("Some String Value", forKey: defaultsKeys.keyOne) defaults.set("Another String Value", forKey: defaultsKeys.keyTwo) // Getting let defaults = UserDefaults.standard if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) { print(stringOne) // Some String Value } if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) { print(stringTwo) // Another String Value }
对于比小configuration,标志或基本string更严重的事情,你应该使用某种持久化存储 – 目前stream行的选项是领域,但你也可以使用SQLite或苹果自己的CoreData 。
他们说使用NSUserDefaults
当我第一次实现长期(closures应用程序后)数据存储时,我在线阅读的所有内容都指向了NSUserDefaults。 然而,我想存储一本字典,虽然可能,但这被certificate是一种痛苦。 我花了几个小时试图让types错误消失。
NSUserDefaults在function上也是有限的
进一步的阅读揭示了NSUserDefaults的读/写是如何强制应用程序读/写所有内容或不写内容的,因此效率不高。 然后我知道检索一个数组并不是直截了当的。 我意识到,如果你存储了多个string或布尔值,NSUserDefaults真的不是理想的。
这也不可扩展。 如果你正在学习如何编码,学习可扩展的方式。 只能使用NSUserDefaults来存储与首选项相关的简单string或布尔值。 使用核心数据存储数组和其他数据,并不像他们说的那么难。 从小开始。
更新:另外,如果您添加Apple Watch支持,还有另一个潜在的考虑因素。 您的应用程序的NSUserDefaults现在会自动发送到Watch Extension。
使用核心数据
所以我忽略了关于核心数据是一个更困难的解决scheme的警告,并开始阅读。 三个小时之内我就开始工作了。 我有我的表格数组保存在核心数据和重新加载数据打开应用程序备份! 教程代码很容易适应,我只能通过一些额外的实验来存储标题和细节数组。
因此,对于阅读这篇文章的人来说,他们正在努力解决NSUserDefaulttypes的问题,或者需要的不仅仅是存储string,而是花一两个小时玩核心数据。
这里是我读的教程:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
如果您没有选中“核心数据”
如果您在创build应用程序时未检查“核心数据”,则可以将其添加,只需要五分钟:
http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-swift-project-in-xcode/
http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-swift-project
如何从核心数据列表中删除
从Coredata Swift中删除数据
Okey,感谢@bploat以及链接http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
我发现对于一些基本的string存储来说,答案非常简单。
let defaults = NSUserDefaults.standardUserDefaults() // Store defaults.setObject("theGreatestName", forKey: "username") // Receive if let name = defaults.stringForKey("username") { print(name) // Will output "theGreatestName" }
使用NSCoding和NSKeyedArchiver是NSUserDefaults
过于复杂的数据的另一个很好的select,但CoreData会过度杀伤。 它还使您有机会更明确地pipe理文件结构,如果要使用encryption,这是非常棒的。
对于Swift 3
UserDefaults.standard.setValue(token, forKey: "user_auth_token") print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
Swift 3.0
安装人员:本地存储
let authtoken = "12345" // Userdefaults helps to store session data locally let defaults = UserDefaults.standard defaults.set(authtoken, forKey: "authtoken") defaults.synchronize()
获取者:本地存储
if UserDefaults.standard.string(forKey: "authtoken") != nil { //perform your task on success }
对于某些不想处理UserDefaults的人来说,还有另一种select – NSKeyedArchiver和NSKeyedUnarchiver。 它有助于使用归档程序将对象保存到文件中,并将归档文件加载到原始对象。
// To archive object, let mutableData: NSMutableData = NSMutableData() let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData) archiver.encode(object, forKey: key) archiver.finishEncoding() return mutableData.write(toFile: path, atomically: true) // To unarchive objects, if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) { let unarchiver = NSKeyedUnarchiver(forReadingWith: data) let object = unarchiver.decodeObject(forKey: key) }
我写了一个简单的工具来保存/加载本地存储对象,使用上面的示例代码。 你可能想看到这个。 https://github.com/DragonCherry/LocalStorage