我正在从服务器获得api调用的一些响应,我希望将其保存在其中。CoreData...大多数字段为本机类型,其中核心数据接受但一个是[String:String]我得把它存起来。我已经经历了几个线程,但大多数线程都建议我创建单独的实体,我不太确定我应该在我的主实体中声明什么,在内部声明的类型应该是什么?.xcdatamodeld档案。以下是数据的样子
struct UserInfo: Codable {
let meta: [String: String]?
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在CoreData中存储字典类型的数据,如 [String:String]
,确实需要一些额外的处理,因为CoreData原生不支持直接存储字典。一种常见的做法是创建一个新的实体来表示这个字典,并通过关系来连接到主实体。以下是如何操作的一个步骤指南:
创建新实体(DictionaryEntity):
.xcdatamodeld
文件中,创建一个新实体,例如 DictionaryEntity
。key
(String类型) 和 value
(String类型)。设置关系:
UserInfoEntity
)中,添加一个新的关系属性,比如叫 metaEntries
。将其类型设置为“多对一”(To Many) 关系,目标实体指向你刚刚创建的 DictionaryEntity
。userInfo
,并将其设为“一对多”(To One),指向 UserInfoEntity
。编码和解码逻辑:
UserInfo
结构体保存到 CoreData 时,你需要遍历 meta
字典,为每个键值对创建一个 DictionaryEntity
实例,并通过关系添加到对应的 UserInfoEntity
实例中。metaEntries
关系中的所有 DictionaryEntity
,重新构建出原始的 [String:String]
字典。Swift 示例代码 (简化示例,未包含错误处理):
保存数据:
func saveUserInfo(userInfo: UserInfo, in managedObjectContext moc: NSManagedObjectContext) {
let userInfoEntity = UserInfoEntity(context: moc)
// 设置其他属性...
for (key, value) in userInfo.meta ?? [:] {
let dictEntry = DictionaryEntity(context: moc)
dictEntry.key = key
dictEntry.value = value
userInfoEntity.addToMetaEntries(dictEntry)
}
try? moc.save()
}
func fetchUserInfo(from moc: NSManagedObjectContext) -> UserInfo? {
let fetchRequest: NSFetchRequest<UserInfoEntity> = UserInfoEntity.fetchRequest()
// 添加过滤条件如果需要
do {
let userInfoEntities = try moc.fetch(fetchRequest)
if let userInfoEntity = userInfoEntities.first {
let metaDict: [String: String] = userInfoEntity.metaEntries.map { ($0.key, $0.value) }.reduce(into: [:], { dict, pair in dict[pair.0] = pair.1 })
return UserInfo(meta: metaDict, /* 其他属性... */)
}
} catch {
print("Fetching failed: \(error)")
}
return nil
}
这样,你就能够有效地将 [String:String]
类型的数据存储到 CoreData 中,并且能够在需要时恢复这些数据。