核心数据 - NSManagedObject(有关系)到 JSON

Posted

技术标签:

【中文标题】核心数据 - NSManagedObject(有关系)到 JSON【英文标题】:Core Data - NSManagedObject (with relationships) to JSON 【发布时间】:2018-07-13 07:44:17 【问题描述】:

我是 Core Data 的新手,我想将 NSManagedObject(从本地数据库获取)转换为 JSON 字符串。如上所示,这是一个具有关系的简单对象:

这是我用来获取的代码:

func loadData() 
    //1
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
        return
    

    let managedContext = appDelegate.persistentContainer.viewContext

    //2
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Bill")

    //3
    do 
        let fetchedData = try managedContext.fetch(fetchRequest) as! [Bill]
     catch let error as NSError 
        print("Could not fetch. \(error), \(error.userInfo)")
    

如何将 fetchedData 转换为 JSON 字符串?我想使用 Codable 但我不知道它是否支持。

【问题讨论】:

你可以在扩展中实现 Codable(Encodable 应该够了吧?)但是你需要手动完成所有的映射。 @JoakimDanielson 如何映射“很多”关系? 【参考方案1】:

为每个类创建一个扩展并让它实现Encodable。洛特是这样的

extension Lot: Encodable 
  enum CodingKeys: String, CodingKey 
    case id
    case quantity
    case expiration
    case quantity_packages
  

  public func encode(to encoder: Encoder) throws 
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(quantity, forKey: . quantity)
    try container.encode(expiration, forKey: . expiration)
    try container.encode(quantity_packages, forKey: . quantity_packages)

对于 Bill,请注意我将 lotsNSSet 转换为 Array

extension Bill: Encodable 
  enum CodingKeys: String, CodingKey 
    case id
    case name
    case lots
  

  public func encode(to encoder: Encoder) throws 
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(name, forKey: .name)
    if let array = lots?.allObjects as? [Lot] 
        try container.encode(array, forKey: .lots)
     // else Not sure what to do here, maybe use an empty array?
  

我无法正确测试这个,但我希望这会有所帮助。

【讨论】:

以上是关于核心数据 - NSManagedObject(有关系)到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 保存在核心数据中但属性错误

是不是不能复制一个核心数据NSManagedObject?

核心数据 NSManagedObject 更改

核心数据 NSManagedObject:最大属性数?

将 NSManagedObject 更新为核心数据

核心数据 - 遍历 NSManagedObject 的属性