iOS - 本地保存键值对数组
iOS - Locally saving an array of key value pairs
在我正在开发的应用程序中,用户需要添加 "enterprise" 才能使用该应用程序。但是,他们可以向应用程序添加多个 "enterprise"。每个添加的企业都需要两件事:名称和企业 API 密钥。
我创建了一个 "Enterprise" class:
class Enterprise : NSObject {
var name:String!
var apiKey:String!
init (name:String, apiKey:String) {
self.name = name
self.apiKey = apiKey
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObjectForKey("name") as String
self.apiKey = decoder.decodeObjectForKey("apiKey") as String
super.init()
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeObject(self.apiKey, forKey: "apiKey")
}
}
关于此 class 需要注意的一件事,在我按照构建此 class 的示例中,他们也将 class 子 class 编辑为 NSCoder作为 NSObject,但是如果我将 "NSCoder" 添加到 class,我会收到以下错误:
Multiple inheritance from classes 'NSObject' and 'NSCoder'
保存数组时我使用了以下内容:
let name = self.enterpriseName.text
let key = self.apiKey.text
if name != "" {
if key != "" {
let defaults = NSUserDefaults.standardUserDefaults()
let objectKey = "enterprise"
var ent = [Enterprise(name: name, apiKey: key)]
var entData = NSKeyedArchiver.archivedDataWithRootObject(ent)
defaults.setObject(entData, forKey: objectKey)
defaults.synchronize()
}
else {
println("No API key")
}
}
else {
println("No name")
}
这似乎在存储一个值时有效,但是当我在启动时检查数组中有多少项时,它只显示 1。
有什么办法可以做到这一点吗?我正在寻找的最终结果类似于:
Enterprises:
Enterprise
name: abc
apiKey: 184nfh692j6j31))8dx
Enterprise
name: def
apiKey: 23oih9823tng893g2gd
Enterprise:
name: ghi
apiKey: sfgYSS4yw44gw31!#%q
如果用户选择删除特定企业,则可以将其从列表中删除。
编辑
这是有效的方法,使用莱昂纳多的(下面,接受的答案)方法:
let name = self.enterpriseName.text
let apiKey = self.apiKey.text
if name != "" {
if apiKey != "" {
var enterprises = NSMutableDictionary()
var loadedEnterprises = Load.dictionary("enterprises")
if loadedEnterprises != nil {
if(loadedEnterprises.count > 0) {
for (key, value) in loadedEnterprises {
enterprises.setObject(value, forKey: key as String)
}
}
}
enterprises.setObject(apiKey, forKey: name)
Save.dictionary("enterprises", enterprises)
}
else {
println("No API key")
}
}
else {
println("No name")
}
您始终为 'enterprise' 键覆盖“企业”,使用数组:
var entArray = defaults.objectForKey(objectKey)
entArray?.addObject(entData)
defaults.setObject(entArray, forKey: objectKey)
编辑:
对我有用,但这不是好的解决方案:
func getEnterprise() {
let objectKey = "enterprise"
// get stored array
let defaults = NSUserDefaults.standardUserDefaults()
var array = defaults.objectForKey(objectKey) as? Array<NSData>
if array != nil {
for data in array! {
var enterprise = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Enterprise
println("\(enterprise!.name)")
}
}
}
func saveEnterprise() {
let name = self.enterpriseName
let key = self.apiKey
if name != "" && name != nil {
if key != "" && key != nil {
let defaults = NSUserDefaults.standardUserDefaults()
let objectKey = "enterprise"
var ent = Enterprise(name: name!, apiKey: key!)
// get stored array
var array = defaults.objectForKey(objectKey) as? Array<NSData>
if array == nil {
array = Array()
}
var entData = NSKeyedArchiver.archivedDataWithRootObject(ent)
array?.append(entData)
defaults.setObject(array, forKey: objectKey)
defaults.synchronize()
}
else {
println("No API key")
}
}
else {
println("No name")
}
}
您应该使用字典,否则您最终可能会得到具有不同密钥的同一企业。我创建了一个 class 来加载和保存用户默认的词典。你应该这样做:
class Load {
class func dictionary(key:String) -> NSDictionary! {
return NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSDictionary
}
}
class Save {
class func dictionary(key:String, _ value:NSDictionary) {
NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
}
}
class Remove {
class func object(key:String) {
NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
}
}
var enterprises:[String:String] = ["abc":"184nfh692j6j31))8dx","def":"23oih9823tng893g2gd","ghi":"sfgYSS4yw44gw31!#%q"]
Save.dictionary("enterprises", enterprises)
name = "jkl"
apiKey = "9a4giNifjKJq6v8G4fb"
if !name.isEmpty {
if !apiKey.isEmpty {
enterprises[name] = apiKey
Save.dictionary("enterprises", enterprises)
} else {
println("No API key")
}
} else {
println("No name")
}
for (key, value) in enterprises {
println("\(key)=\(value)")
}
let loadedDictionary = Load.dictionary("enterprises")
for (key, value) in loadedDictionary {
println("\(key)=\(value)")
}
在我正在开发的应用程序中,用户需要添加 "enterprise" 才能使用该应用程序。但是,他们可以向应用程序添加多个 "enterprise"。每个添加的企业都需要两件事:名称和企业 API 密钥。
我创建了一个 "Enterprise" class:
class Enterprise : NSObject {
var name:String!
var apiKey:String!
init (name:String, apiKey:String) {
self.name = name
self.apiKey = apiKey
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObjectForKey("name") as String
self.apiKey = decoder.decodeObjectForKey("apiKey") as String
super.init()
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeObject(self.apiKey, forKey: "apiKey")
}
}
关于此 class 需要注意的一件事,在我按照构建此 class 的示例中,他们也将 class 子 class 编辑为 NSCoder作为 NSObject,但是如果我将 "NSCoder" 添加到 class,我会收到以下错误:
Multiple inheritance from classes 'NSObject' and 'NSCoder'
保存数组时我使用了以下内容:
let name = self.enterpriseName.text
let key = self.apiKey.text
if name != "" {
if key != "" {
let defaults = NSUserDefaults.standardUserDefaults()
let objectKey = "enterprise"
var ent = [Enterprise(name: name, apiKey: key)]
var entData = NSKeyedArchiver.archivedDataWithRootObject(ent)
defaults.setObject(entData, forKey: objectKey)
defaults.synchronize()
}
else {
println("No API key")
}
}
else {
println("No name")
}
这似乎在存储一个值时有效,但是当我在启动时检查数组中有多少项时,它只显示 1。
有什么办法可以做到这一点吗?我正在寻找的最终结果类似于:
Enterprises:
Enterprise
name: abc
apiKey: 184nfh692j6j31))8dx
Enterprise
name: def
apiKey: 23oih9823tng893g2gd
Enterprise:
name: ghi
apiKey: sfgYSS4yw44gw31!#%q
如果用户选择删除特定企业,则可以将其从列表中删除。
编辑
这是有效的方法,使用莱昂纳多的(下面,接受的答案)方法:
let name = self.enterpriseName.text
let apiKey = self.apiKey.text
if name != "" {
if apiKey != "" {
var enterprises = NSMutableDictionary()
var loadedEnterprises = Load.dictionary("enterprises")
if loadedEnterprises != nil {
if(loadedEnterprises.count > 0) {
for (key, value) in loadedEnterprises {
enterprises.setObject(value, forKey: key as String)
}
}
}
enterprises.setObject(apiKey, forKey: name)
Save.dictionary("enterprises", enterprises)
}
else {
println("No API key")
}
}
else {
println("No name")
}
您始终为 'enterprise' 键覆盖“企业”,使用数组:
var entArray = defaults.objectForKey(objectKey)
entArray?.addObject(entData)
defaults.setObject(entArray, forKey: objectKey)
编辑:
对我有用,但这不是好的解决方案:
func getEnterprise() {
let objectKey = "enterprise"
// get stored array
let defaults = NSUserDefaults.standardUserDefaults()
var array = defaults.objectForKey(objectKey) as? Array<NSData>
if array != nil {
for data in array! {
var enterprise = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Enterprise
println("\(enterprise!.name)")
}
}
}
func saveEnterprise() {
let name = self.enterpriseName
let key = self.apiKey
if name != "" && name != nil {
if key != "" && key != nil {
let defaults = NSUserDefaults.standardUserDefaults()
let objectKey = "enterprise"
var ent = Enterprise(name: name!, apiKey: key!)
// get stored array
var array = defaults.objectForKey(objectKey) as? Array<NSData>
if array == nil {
array = Array()
}
var entData = NSKeyedArchiver.archivedDataWithRootObject(ent)
array?.append(entData)
defaults.setObject(array, forKey: objectKey)
defaults.synchronize()
}
else {
println("No API key")
}
}
else {
println("No name")
}
}
您应该使用字典,否则您最终可能会得到具有不同密钥的同一企业。我创建了一个 class 来加载和保存用户默认的词典。你应该这样做:
class Load {
class func dictionary(key:String) -> NSDictionary! {
return NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSDictionary
}
}
class Save {
class func dictionary(key:String, _ value:NSDictionary) {
NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
}
}
class Remove {
class func object(key:String) {
NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
}
}
var enterprises:[String:String] = ["abc":"184nfh692j6j31))8dx","def":"23oih9823tng893g2gd","ghi":"sfgYSS4yw44gw31!#%q"]
Save.dictionary("enterprises", enterprises)
name = "jkl"
apiKey = "9a4giNifjKJq6v8G4fb"
if !name.isEmpty {
if !apiKey.isEmpty {
enterprises[name] = apiKey
Save.dictionary("enterprises", enterprises)
} else {
println("No API key")
}
} else {
println("No name")
}
for (key, value) in enterprises {
println("\(key)=\(value)")
}
let loadedDictionary = Load.dictionary("enterprises")
for (key, value) in loadedDictionary {
println("\(key)=\(value)")
}