使用NSKeyedArchiver保存和加载对象数据 - 对象变量更改后数据丢失

时间:2017-10-10 16:00:50

标签: arrays swift data-structures

我使用NSKeyedArchiver()在Swift中保存和加载对象。

问题是当对象变量发生变化时,比如将新变量添加到对象中,NSKeyedArchiver()无法解码最后保存的对象。

func tripsDataFilePath() -> URL {
    return getDocumentsDirectory().appendingPathComponent("Data.plist")
}

我用来保存的代码:

func saveData() {
    NSKeyedArchiver.archiveRootObject(data, toFile: dataFilePath().path)

}

和加载代码:

func loadData() {
    if let data = NSKeyedUnarchiver.unarchiveObject(withFile: dataFilePath().path) {
        project = data as! [Project]
    }
}

在更改对象结构时,有没有办法防止数据丢失(无法加载最后的对象)?

开发第一版iOS应用时并不重要。但想象一下,用户下载了应用程序,在新版本中,我想添加需要更改当前数据对象的新功能!然后用户将丢失所有数据。

2 个答案:

答案 0 :(得分:0)

我发现问题出在文件格式上。

我使用此名称保存NSKeyedArchiver对象:“Data.plist”

当我删除“.plist”格式时,问题已经解决。

答案 1 :(得分:0)

尝试检查解码数据的方式。我用decodeObject解码所有数据。但是,从swift 3.0开始,您需要具体说明如何解码数据。例如,如果您的数据是整数,而不是使用

让number = aDecoder.decodeObject(forKey:CodingKeys.number)为? INT

你需要使用

let number = aDecoder.decodeInteger(forKey:CodingKeys.number)