首页 > 解决方案 > 使用 NSBatchInsertRequest 将自定义数组插入 CoreData

问题描述

我有符合我的 CoreData 实体模型的自定义数组。目标是使用 NSBatchInsertRequest 将其插入到我的 CoreData 表中。问题是我的自定义数组不是 NSBatchInsertRequest 对象类型所期望的 [[String:Any]] 类型。如何在不循环并将它们转换为键值对的情况下实现这一点(如果我循环 NSBatchInsertRequest 的目标将毫无用处)。我尝试了一种解决方法,但被卡在了中间。到目前为止我所做的如下。

定制模型

struct DataModel:Codable {
  let id:Int?
  let title:String?
  let descriptionText:String?
}

让我陷入错误“无法将'[DataModel]'类型的值转换为预期的参数类型'[[String:Any]]'”

func saveData(model: [DataModel]) {

     let entity =  NSEntityDescription.entity(forEntityName: "User", in: managedObjectContext)
    let insertRequest = NSBatchInsertRequest(entity:entity!, objects: model)//Error is here

    try! context?.execute(insertRequest)
    try! context?.save()

}

到目前为止,我尝试创建一个扩展以将其转换为字典(我不确定这是否是最佳选择)

extension Encodable {
 subscript(key: String) -> Any? {
    return dictionary[key]
 }
 var dictionary: [String: Any] {
    return (try? JSONSerialization.jsonObject(with: JSON.encoder.encode(self))) as? [String: Any] ?? [:]
 }
}


struct JSON {
 static let encoder = JSONEncoder()
}

但这只会转换数组内的单个对象(仅当您指定索引时)。实现我的目标的最佳方式是什么?

标签: iosswiftcore-data

解决方案


您已经写入var dictionaryextension Encodable获取模型的字典版本。您现在可以映射方法内的模型数组saveData

let dictionaries = model.map {$0.dictionary}

推荐阅读