ios - 使用 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()
}
但这只会转换数组内的单个对象(仅当您指定索引时)。实现我的目标的最佳方式是什么?
解决方案
您已经写入var dictionary
以extension Encodable
获取模型的字典版本。您现在可以映射方法内的模型数组saveData
。
let dictionaries = model.map {$0.dictionary}
推荐阅读
- java - Query Elastic DSL - 使用 Spring Boot 数据进行搜索查询
- python - 带有 python 请求的 Docker 命令
- azure-devops - Azure Devops 中的单个团队是否可以有多个积压工作?
- google-cloud-platform - 谷歌云防火墙
- javascript - b-card-img-lazy 未在未找到图像上触发错误事件
- javascript - 向对象添加新字段时遇到问题
- audiokit - Audiokit:(V5)音序器无法在轨道的同一位置同时播放音符
- java - 保存 ImageView 背景状态
- python - 基维不工作。[CRITICAL] [Window] 找不到任何有价值的 Window 提供程序
- javascript - 如何在反应中并排放置两个输入字段