在 NSUserDefaults 中存储字典并使用存储的数据。

Posted

技术标签:

【中文标题】在 NSUserDefaults 中存储字典并使用存储的数据。【英文标题】:Storing a dictionary in NSUserDefaults and using the data stored. 【发布时间】:2015-09-02 12:50:56 【问题描述】:

我已经为这个问题苦苦挣扎了 5 天。不是开玩笑。请帮忙!这是我遇到的问题。

我所知道的:

我将var addressDict = Dictionary<Int, Array<String>>() 声明为全局变量。现在,我了解以下代码用于附加存储在我的 addressDict 中的数据并更改类型,以便可以将数据存储到 NSUserDefaults 中。

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData  
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)

现在,每次我运行应用程序时,存储在addressDict2 中的数据都会被我的addressDict 覆盖,因为当应用程序启动时,addressDict 中没有数据。因此,即使我可能在addressDict2 中添加了一些数据,它也会被没有数据的addressDict 覆盖。

因此,为了解决这个问题,我可以运行上面的代码,但没有 self.defaults.setObject(data, forKey: "addressDict") 行,现在,addressDict2 不再被不包含数据的变量 addressDict 覆盖。所以我附加的数据存储在addressDict2。但是,如果我这样做,我将无法再将新信息附加到addressDict2,因为我不再拥有self.defaults.setObject(data, forKey: "addressDict")。我希望你在这里看到我的困境......

我想知道的:

这就是我希望我的代码执行的操作。我希望能够将新信息附加到某个变量中,例如addressDict2。当应用程序启动时,我希望将addressDict2 中的数据复制到addressDict。所以这将导致addressDict 保存我希望它保存的数据。

我的尝试:

为了解释我上面的意思,这里有一些代码。请注意,此代码不起作用,它只是为了澄清我的意思并显示以下代码是否有效,我认为它将解决我的问题(如果我我错了)。所以在我的viewDidLoad() 中,我会有类似的内容:

override func viewDidLoad() 
    super.viewDidLoad()

    if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil 
        if let data2 = defaults.objectForKey("addressDict") as? NSData  
            addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>>
        
    

所以现在,当我运行这段代码时:

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData  
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)

这里的addressDict 将不再为空,也不会用空数据覆盖addressDict2。我将能够使用addressDict 处理所有永久存储的数据!生活将是美好的。但我不知道该怎么做。

附注对于问题的长度,我深表歉意。感谢您的宝贵时间!

【问题讨论】:

我已经回答了你的问题here。我发布的代码可以编译并且工作正常。你需要的是一个简单的类型转换。 实际上不需要使用NSKeyedUnarchiver,因为包含IntStringArray类型的字典符合属性列表。 @Adam,我不确定你是否回答了我在这里提出的问题(当然,我很可能是不正确的)。我想我更进一步,正如@Rajatp 所说,合并addressDictaddressDict2 以便addressDict2 中的数据可以“放入”addressDict 【参考方案1】:

同时将数据保存到字典中:

let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey")

使用保存的数据时:

if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil 

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary

【讨论】:

以上是关于在 NSUserDefaults 中存储字典并使用存储的数据。的主要内容,如果未能解决你的问题,请参考以下文章

更改 NSUserDefaults 中的对象而不创建和重新设置副本

有没有办法操纵 NSUserDefaults 存储的信息

存储 NSUserDefaults (Xcode) 时避免重复

保存到 NSUserDefaults 的字典总是返回 nil

无法从 NSUserDefaults 获取字典作为保存格式

无法更新 NSUserDefaults 中字典的键值