【问题标题】:Using CoreData to save array containing dictionaries使用 CoreData 保存包含字典的数组
【发布时间】:2019-09-09 14:23:30
【问题描述】:

我第一次尝试在 iOS 应用程序中使用 CoreData 框架,但遇到了一些问题。

我有一种复杂类型的数组,包含包含字典的元组:

let DataSet: [( Float, Float, [String : String])] = ...

我创建了一个NSManagedObjectContext 和一个NSManagedObject,我将DataSet 数组添加到NSManagedObject,但是当我尝试保存第一个NSManagedObjectContext 时,应用程序崩溃了。

使用普通数组不会发生这种情况,而只有像上面那样更复杂的数组才会发生这种情况。

有没有办法解决这个问题?我需要调整我的 xcdatamodel 吗?

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 正确使用Core Data并尽可能创建实体,字典是一个(A),元组是另一个(B),A和B之间是一对一的关系跨度>
  • 您是否真的需要将数据保存为一个复杂的数组,或者您可以更简单地从数组中的每个元素动态构造该数组,作为离散属性单独保存(保存),使用 CoreData 框架?

标签: ios swift xcode core-data


【解决方案1】:
  1. 首先您需要声明 2 个独立的实体。一个用于浮点数,另一个用于字典。
  2. 然后在 Float 实体和 Dictionary 之间创建“一对多”关系。它看起来像这样,

  3. 然后你需要将你的元组转换成这两个实体,像这样,

    dataSet.forEach{ (member) in
        let tuple = Test.(context: mainContext)
        tuple.first = member.0
        tuple.second = member.1
    
        let dictionary = member.2
        dictionary.forEach{ (key, value) in
            let dick = Dick.(context: mainContext)
            dick.key = key
            dick.value = value
            tuple.addToContains(dick)
        }
    }
    
  4. 最后你需要保存这些值。

    if mainContext.hasChanges {
        do {
            try mainContext.save()
        } catch {
            print(\(error))
        }
    }
    

【讨论】:

  • 邮政编码作为文本,而不是图像。文本是可搜索的,可以复制到文本编辑器或 Xcode 中,而图像则毫无用处。
  • @JoakimDanielson 对不起。这次代码格式化程序给我格式化代码带来了一些麻烦。所以不能这样发布。
  • 那就找出问题所在解决吧,请不要放图。
  • 问题是,看起来代码格式化程序不会接受 2 forEach 相互之间。尝试修复它 15 分钟。除了这个没有任何效果。
  • 格式化程序不智能 - 我知道代码以两种方式显示在屏幕上 - 作为一整行 - 四 (4) 个空白字符空格作为前缀 - 或作为段落 - 包含在此字符 `.正确格式化答案所需的所有信息都包含在 SO 站点中。 How do I format my posts...我通过在您的图像中编写代码在 4 中编辑了您的答案。在转换为“代码”格式之前,它需要八 (8) 个字符空间。我怀疑这是因为它属于数字点格式块。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多