保存和加载结构数组的最佳做法是啥?

Posted

技术标签:

【中文标题】保存和加载结构数组的最佳做法是啥?【英文标题】:Whats the best practice to save and load array of struct?保存和加载结构数组的最佳做法是什么? 【发布时间】:2019-06-06 10:06:41 【问题描述】:

我正在寻找保存我的结构数组的建议,以便它们在开始时可用并且可以轻松访问和更新。

我看过的所有教程都只有 1 个结构实例,所以我在实现结构数组时一直失败。

数据结构是:

    struct Stock : Codable 
        let ticker : String
        let amount : Double
        var boughtAt : Double
        var totalValue : Double
        var realTimePrice : Double
        var float : Double
        var type : String
    

    var stocksArray = [Stock]()

【问题讨论】:

您应该解释使用案例以及您到目前为止所做的尝试,以便我们更好地回答您的问题 使用核心数据 :) 了解您要存储多少数据非常重要。另外,您一直在关注什么技术(例如,您尝试将数据存储在哪里)? 首先UserDefaults不鼓励这种用户数据,您可以在文档文件夹、Core Data、Realm、Firebase、mysql 等其他数据库中使用编码数据作为 JSON 或属性列表文件. 或 CloudKit 感谢@J.Doe 的想法 :) 我实际上是通过 CoreData 让它工作的。 【参考方案1】:

由于您的struct Stock 符合Codable,您可以使用JSONEncoder 轻松地将array [Stock] 存储为UserDefaults 中的data,即

var stocksArray = [Stock]()
do 
    let data = try JSONEncoder().encode(stocksArray)
    UserDefaults.standard.set(data, forKey: "stocksArray")
 catch  
    print(error)

同样,您可以使用JSONDecoder 之类的方式从UserDefaults 获取,

if let data = UserDefaults.standard.data(forKey: "stocksArray") 
    do 
        let arr = try JSONDecoder().decode([Stock].self, from: data)
        print(arr)
     catch 
        print(error)
    

这是存储array 的一种方式。还有其他方法 - CoreDataFile 等。

【讨论】:

这完美!对我来说非常简短易懂。最重要的是,一旦数据被加载,它的结构与我需要的完全相同,谢谢! 二进制property lists 可能是UserDefaults 中更好的存储格式【参考方案2】:

在我看来, 您可以将您的 Struct 转换为 Dictionary 类型并将该字典添加到 NSArray 并将该数组保存到手机的 Document 目录中。

例子,

struct Stock 
    var ticker : String = ""
    var amount : Double = 0.0
    var boughtAt : Double = 0.0
    var totalValue : Double = 0.0
    var realTimePrice : Double = 0.0
    var float : Double = 0.0
    var type : String = ""

    var json:Dictionary<String,Any> 
        set
            self.ticker = newValue["ticker"] as! String
            self.amount = newValue["amount"] as! Double
            self.boughtAt = newValue["boughtAt"] as! Double
            self.totalValue = newValue["totalValue"] as! Double
            self.realTimePrice = newValue["realTimePrice"] as! Double
            self.float = newValue["float"] as! Double
            self.type = newValue["type"] as! String
        
        get 
            return ["ticker":self.ticker,"amount":self.amount,"boughtAt":self.boughtAt,"totalValue":self.totalValue,"realTimePrice":self.realTimePrice,"float":self.float,"type":self.type]
        
    

    init(withJSON json:Dictionary<String,Any>) 
        self.json = json
    

//Now, get dictionary from object and add it into array.
let stock = Stock(withJSON: [:])
let json = self.stock.json
let array = NSArray(arrayLiteral: json)

//Now, you can save NSArray to file.
array.write(toFile: "file path.plist", atomically: true)

//You can get array from plist file,
let array = NSArray(contentsOfFile: "file path.plist")

【讨论】:

感谢您的这个想法 :) 但是,我会将该数据用于 UITable(我忘了提及),所以我必须在使用它之前重新创建我的结构。

以上是关于保存和加载结构数组的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

存储数据列表并自动分配给结构的最佳方法是啥

保存多语言数据的最佳数据库结构是啥? [复制]

java中保存Bigdata Integer记录的最佳数据结构是啥?

在 PostgreSQL 上保存价格列的最佳做法是啥? [复制]

将临时数据保存为后端面板上的子选项的最佳做法是啥?

保留几个组合框(列表框)的最佳表结构是啥