【问题标题】:How to use Codable and Coredata together?如何同时使用 Codable 和 Coredata?
【发布时间】:2018-08-11 05:49:18
【问题描述】:

我正在尝试使用 Coredata 实现 Codable。我已经尝试遵循以下答案,但仍然没有运气。

How to use swift 4 Codable in Core Data?

我遇到的错误/问题是我的项目继续说:“每当我尝试编码或解码对象时,参数类型‘用户’不符合预期的类型‘可编码’。

我在 CoreData 中创建了实体并创建了 NSManagedObject 子类:

import Foundation
import CoreData

@objc(User)
public class User: NSManagedObject, Codable {

// MARK: - Codable setUp
enum CodingKeys: String, CodingKey {
    case fullname
    case email
    case zipcode
    case usertype = "user_type"
}


// MARK: - Decoding the data
required convenience init(from decoder: Decoder) {
    guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else {NSLog("Error: with User context!")
        return
    }

    guard let entity = NSEntityDescription.entity(forEntityName: "User", in: context) else {
        NSLog("Error with user enity!")
        return
    }

    self.init(entity: entity, in: context)

    let values = try decoder.container(keyedBy: CodingKeys.self)
    fullname = try values.decode(String.self, forkey: .fullname)
    email = try values.decode(String.self, forkey: .email)
    zipcode = try values.decode(String.self, forkey: .zipcode)
    userType = try values.decode(String.self, forkey: .userType)

}

// MARK: - Encoding the data
func encode(to encoder: Encoder) throws {
    var container = try encoder.container(keyedBy: CodingKeys.self)

    try container.encode(fullname, forkey: .fullname)
    try container.encode(email, forkey: .email)
    try container.encode(usertype, forkey: .usertype)
    try container.encode(zipcode, forkey: .zipcode)
}


}

// This helps with decoding
extension CodingUserInfoKey {
   static let context = CodingUserInfoKey(rawValue: "context")
}

当我尝试解码对象并将用户保存到 firebase 时,我收到一条警告,提示“在参数类型 'User.Type' 中,'User' 不符合预期的类型 'Decodable'

当我尝试编码时,我收到一条警告说“参数类型'用户'不符合预期的类型'可编码'

【问题讨论】:

  • 您的代码在操场上给出了不同的错误。它说您的initencode 方法必须声明为public,因为您的用户类是public。您没有收到这些错误吗?

标签: swift xcode core-data codable


【解决方案1】:

您的问题可能与 CoreData/Codable 无关,而是与导入的 User 模型有关,该模型实际上不符合 Codable。

Firebase 在其FirebaseAuth.framework (Reference) 中定义了一个User。如果您在文件顶部import Firebase,它还将导入该用户声明。 IMO 这是 Firebase 糟糕的 API 设计,因为许多也使用 FirebaseAuth 的应用在某些时候会有一个带有一些自定义属性的用户模型......

如果您在该文件中不需要 FirebaseAuth,只需导入更具体的 Firebase 框架,例如import FirebaseDatabase 避免导入他们的用户模型。

否则,为了帮助编译器选择您的用户模型而不是导入的模型,您可以在 User.self 前面显式添加您的模块名称:YourModule.User.self

【讨论】:

    【解决方案2】:

    User' 不符合预期的“Decodable”类型

    由于拼写错误(区分大小写很重要):

    case usertype ......forKey: .userType)

    encode/decode(:forKey:) 方法的大写字母为K

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2019-04-11
      • 2019-03-03
      • 2023-04-09
      • 2019-04-19
      • 1970-01-01
      相关资源
      最近更新 更多