更新 Plist 数据而不删除旧数据

Posted

技术标签:

【中文标题】更新 Plist 数据而不删除旧数据【英文标题】:Update Plist data without erasing old data 【发布时间】:2021-02-09 13:22:47 【问题描述】:

我正在尝试使用 swift 和 cocoa 制作文件下载器应用程序。我正在使用 plist 作为下载历史。读取数据是可行的,但是写入数据会擦除以前的数据并将其替换为新数据。

这里是代码

 let newdownloaditem = downloadList(root: [downloadListt(downloadURL: response.url!.absoluteString, fileName: response.suggestedFilename!)])
// This is a codeable method 
                                let encoder = PropertyListEncoder()
                                encoder.outputFormat = .xml
                                
                                let pListFilURL = uniqueDataDir()?.appendingPathComponent("downloads.plist")
                                do 
                                    let data = try encoder.encode(newdownloaditem)
                                    try data.write(to: pListFilURL!)
// Here is the problem
                                 catch 
                                    print(error)
                                


// Here is the codeable
public struct downloadList: Codable 
    let root: [downloadListt]

public struct downloadListt: Codable 
    let downloadURL: String
    let fileName: String

Here is an image of what happens

内容被删除

谢谢!

【问题讨论】:

什么是newdownloaditem?您需要先阅读 plist,然后添加 newItem,然后再写入。 @Larme newdownloaditem 是一种用于读写plist的可编码方法 "写入数据将删除以前的数据并替换为新数据" 您需要读取当前保存的数据,将新数据添加到其中并保存。但是我看不到您在哪里读取以前保存的数据,在哪里附加了新数据。您似乎只在前一个数据上保存(覆盖)新数据。 我知道,但我需要将新代码放在 let newItem = downloadListt(downloadURL: response.url!.absoluteString, fileName: response.suggestedFilename!); var allItems: [downloadListt] = []; allItems.append(contentsOf: previousList.root); allitems.append(newItem); let newList = downloadList(root: allItems); let data = try encoder.encode(newList)。但是,以大写开头的类/结构命名:downloadList => DownloadListdownloadListt 是一个坏名字,最好是DownloadItem,双“t”不会产生差异. 【参考方案1】:

您确实在用新数据替换以前的数据。

您需要检索以前的数据。 将新数据附加到其中。 保存该组合
let newItem = downloadListt(downloadURL: response.url!.absoluteString, 
                            fileName: response.suggestedFilename!)
var allItems: [downloadListt] = []
allItems.append(contentsOf: previousList.root)
allitems.append(newItem)
let newList = downloadList(root: allItems)
...
let data = try encoder.encode(newList)
try data.write(to: pListFilURL!)

不相关但推荐(这是惯例): 你应该开始用大写命名你的结构/类:downloadList => DownloadList

我会避免命名downloadListt,这是不可更改的,乍一看很难区分downloadListtdownloadList。相反,将其命名为DownloadItem。更具可读性。

【讨论】:

以上是关于更新 Plist 数据而不删除旧数据的主要内容,如果未能解决你的问题,请参考以下文章

将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的

从 plist 错误 Swift 加载

更新数据库并删除旧的

使用 pList 更新核心数据

如何每次将新数据保存到我的 plist 文件而不是替换旧数据?

添加到文件而不删除里面的内容