开发者社区 问答 正文

在CoreData中存储字典

我正在从服务器获得api调用的一些响应,我希望将其保存在其中。CoreData...大多数字段为本机类型,其中核心数据接受但一个是[String:String]我得把它存起来。我已经经历了几个线程,但大多数线程都建议我创建单独的实体,我不太确定我应该在我的主实体中声明什么,在内部声明的类型应该是什么?.xcdatamodeld档案。以下是数据的样子

struct UserInfo: Codable {

  let meta: [String: String]?

}

展开
收起
游客5akardh5cojhg 2019-12-23 20:59:17 516 分享 版权
阿里云 AI 助理回答

在CoreData中存储字典类型的数据,如 [String:String],确实需要一些额外的处理,因为CoreData原生不支持直接存储字典。一种常见的做法是创建一个新的实体来表示这个字典,并通过关系来连接到主实体。以下是如何操作的一个步骤指南:

  1. 创建新实体(DictionaryEntity):

    • 在你的 .xcdatamodeld 文件中,创建一个新实体,例如 DictionaryEntity
    • 为这个实体添加两个属性:key (String类型) 和 value (String类型)。
  2. 设置关系:

    • 在你的主实体(假设是 UserInfoEntity)中,添加一个新的关系属性,比如叫 metaEntries。将其类型设置为“多对一”(To Many) 关系,目标实体指向你刚刚创建的 DictionaryEntity
    • 设置好关系的反向关系,通常命名为 userInfo,并将其设为“一对多”(To One),指向 UserInfoEntity
  3. 编码和解码逻辑:

    • 当你需要将 UserInfo 结构体保存到 CoreData 时,你需要遍历 meta 字典,为每个键值对创建一个 DictionaryEntity 实例,并通过关系添加到对应的 UserInfoEntity 实例中。
    • 反之,当你从 CoreData 读取数据时,你需要遍历 metaEntries 关系中的所有 DictionaryEntity,重新构建出原始的 [String:String] 字典。
  4. 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 中,并且能够在需要时恢复这些数据。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: