如何一起使用Codable和Coredata?

时间:2018-03-02 23:20:26

标签: swift xcode core-data codable

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

How to use swift 4 Codable in Core Data?

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

我在CoreData中创建了Entity并创建了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'不符合预期类型'可解码'

当我尝试编码时,我收到一条警告,上面写着"参数类型'用户'不符合预期类型' Encodable'

1 个答案:

答案 0 :(得分:0)

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

Firebase在UserReference)中定义FirebaseAuth.framework。如果您import Firebase位于文件顶部,则还会导入该用户声明。 IMO这是Firebase的错误API设计,因为许多使用FirebaseAuth的应用程序在某些时候都会有一个带有一些自定义属性的用户模型......

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

否则,为了帮助编译器选择用户模型而不是导入的模型,您可以使用模块名称User.self明确地添加YourModule.User.self