【问题标题】:How can i save more than one data in Codable (Swift)如何在 Codable (Swift) 中保存多个数据
【发布时间】:2018-06-29 07:06:14
【问题描述】:

我使用带有 JSONEncoder 和 JSONDecoder 的 Codable 协议。

但是我保存数据的时候,只保存了最后一个值,但是我需要保存多个。

如果我添加三张卡片,我只能看到最后一张。

例子:

我加卡:

        CName: Test1, BarCode: 12345, CardNBR: 12345

        CName: Test2, BarCode: 1234567, CardNBR: 1234567

        CName: Test3, BarCode: 123456789, CardNBR: 123456789

最后我只看到:CName: Test3, BarCode: 123456789, CardNBR: 123456789

如何保存多个数据?

struct Entity : Codable  {

   var cname: String
   var barcode: String
   var cardnbr: String
}

保存

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

do {
   let data  = try JSONEncoder().encode(all)
   UserDefaults.standard.set(data, forKey: "Key")
} catch {
   print(error)
}

加载

do {
   let content = UserDefaults.standard.data(forKey: "Key")
   let saved = try JSONDecoder().decode([Entity].self, from: content!)
   print(saved)
} catch {
   print(error)
}

新

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

        let jsonEncoder = JSONEncoder()
        do {
            var jsonData = try jsonEncoder.encode(arr)
            let jsonString = String(data: jsonData, encoding: .utf8)
            print("JSON String : " + jsonString!)

            let jsonDecoder = JSONDecoder()
            let upMovie = try jsonDecoder.decode(Entity.self, from: jsonData)
            print("upMovie : \(upMovie)")
            print("cname : \(arr.cname)")
            print("barcode : \(arr.barcode)")
            print("cardnbr : \(arr.cardnbr)")
            entities.append(Entity(cname: arr.cname, barcode: arr.barcode, cardnbr: arr.cardnbr))
            print(entities)
        }
        catch {
        }

【问题讨论】:

  • 您的let all = [] 行仅创建Entity 的单个实例。您不会显示用于制作单独实例并将它们添加到数组中的代码。
  • 首先请遵守变量名以小写字母开头的命名约定。 all 保存时只包含一项。
  • 您好,我认为本教程将帮助您获得所需的内容,请访问链接。 ashishkakkad.com/2017/06/…
  • @hardikvyas 要使用本教程,我仍然只保存最后一个值 JSON 字符串:{"cname":"Test3","barcode":"123456789","cardnbr":"123456789"}
  • @hardikvyas 我有数组 var entity = [Entity]() 我需要做这个来向这个数组添加数据?:entities.append(Entity(cname: arr. cname,条形码:arr.barcode,cardnbr:arr.cardnbr))

标签: arrays swift data-structures codable


【解决方案1】:

每次保存新的

let arr = Entity(cname: CompanyName, barcode: BarCodeField, cardnbr: CardNumber)

只包含一个实体,这就是你只得到最后一个实体的原因

解决方案:在保存之前,您还必须添加最后保存的数组。
假设一个实体

let aEntity = Entity(CName: "Test1", BarCode: "12345", CardNBR: "12345")

然后保存

if var all :[Entity] = loadData() {
    all.append(aEntity)
    saveData(allData: all)
}else {
    saveData(allData: [aEntity])
}

在类中添加以下函数

func saveData(allData:[Entity]) {
    do {
        let data  = try JSONEncoder().encode(allData)
        UserDefaults.standard.set(data, forKey: "Key")
    } catch {
        print(error)
    }
}
func loadData() -> [Entity]?{
    do {
        if let content = UserDefaults.standard.data(forKey: "Key") {
            let saved :[Entity] = try JSONDecoder().decode([Entity].self, from: content)
            print(saved)
            return saved
        }
    } catch {
        print(error)
    }
    return nil
}

【讨论】:

  • 当我将数据添加到数组时:entities.append(Entity(cname: arr.cname,barcode:arr.barcode, cardnbr:arr.cardnbr)) 结果,我的数组:[CardHolder.Entity(cname:“Test”,barcode:“1234”,cardnbr:“1234”),CardHolder.Entity(cname:“Hdhdhd”,barcode:“646464”,cardnbr:“ 499494")]
  • 您应该遵守 Swift 命名约定,对于函数和变量名称,它是 lowerCamelCase。你的函数应该被称为loadData 和saveData。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2018-09-07
相关资源
最近更新 更多