如何一起使用Codable和Coredata?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何一起使用Codable和Coredata?相关的知识,希望对你有一定的参考价值。

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

How to use swift 4 Codable in Core Data?

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

我在Core Data中创建了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'不符合预期类型'Decodable'

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

答案

用户'不符合预期类型'可解码

由于拼写错误(案件敏感性很重要):

case usertype ...对阵...forKey: .userType)

encode/decode(:forKey:)方法有一个资本K

另一答案

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

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

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

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

以上是关于如何一起使用Codable和Coredata?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Core Data 中使用 swift 4 Codable?

如何在 Core Data 中使用 swift 4 Codable?

CoreData 和 Codable 类编译器错误:在从初始化程序返回之前,未在所有路径上调用“self.init”

iOS swift Codable 不能与 Alamofire 一起使用 JSON 嵌套数据?

NSManagedObject 和 Codable 用于存储在服务器和本地存储中的类

如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?