2017-10-10 65 views
0

我正在使用NSKeyedArchiver()在Swift中保存和加载对象。使用NSKeyedArchiver保存和加载对象数据 - 对象变量发生变化后数据丢失

问题是当对象变量发生变化时,例如将新变量添加到对象中,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应用程序并不重要。但想象一下,用户下载了应用程序,并且在新版本中我想添加需要更改当前数据对象的新功能!那么用户将丢失所有数据。

+0

您可以使用NSKeyedArchiver吗? – jervine10

+0

随意处理相应的错误,而不是打印通用文字字符串(解码器可以抛出几个不同的错误)并编写一个逻辑来迁移旧版本。 – vadian

+0

你问是否会处理数据丢失。我相信它的确如此。我们在我们的应用中使用NSKeyedArchiver,永不丢失升级数据。但是,您必须迁移适当的数据,并为您添加的新字段提供默认值。 – jervine10

回答

0

我发现问题与文件格式有关。

我已经使用这个名字保存的NSKeyedArchiver对象:“Data.plist”

,当我已删除“的.plist”的格式,这个问题已经解决了。