如何在核心数据中使用swift 4 Codable?

可编码似乎是一个非常令人兴奋的功能。但是我想知道我们如何在核心数据中使用它?特别是,是否可以直接从NSManagedObject编码JSON或从其解码JSON?


我尝试了一个非常简单的示例:

http://img4.mukewang.com/5d85978900012ed901890252.jpg

并定义了Foo自己:


import CoreData


@objc(Foo)

public class Foo: NSManagedObject, Codable {}

但是当这样使用它时:


let json = """

{

    "name": "foo",

    "bars": [{

        "name": "bar1",

    }], [{

        "name": "bar2"

    }]

}

""".data(using: .utf8)!

let decoder = JSONDecoder()

let foo = try! decoder.decode(Foo.self, from: json)

print(foo)

编译器因以下错误而失败:


super.init isn't called on all paths before returning from initializer

而目标文件是定义的文件 Foo


我想我可能做错了,因为我什至没有通过NSManagedObjectContext,但是我不知道该贴在哪里。


核心数据是否支持Codable?


小怪兽爱吃肉
浏览 624回答 3
3回答

UYOU

CoreData是其自己的持久性框架,根据其详尽的文档,您必须使用其指定的初始化程序,并遵循相当特定的路径来创建和存储对象。您仍然可以像使用Codable一样以有限的方式使用它NSCoding。一种方法是使用这两种协议之一解码对象(或结构),然后将其属性转移到NSManagedObject您根据Core Data文档创建的新实例中。另一种方法(非常常见)是仅对要存储在托管对象属性中的非标准对象使用一种协议。“非标准”是指不符合模型中指定的Core Data的标准属性类型的任何内容。例如,NSColor不能将它直接存储为托管对象属性,因为它不是CD支持的基本属性类型之一。相反,您可以用于NSKeyedArchiver将颜色序列化为一个NSData实例,并将其作为Data属性存储在托管对象中。用逆转此过程NSKeyedUnarchiver。这很简单,使用Core Data可以有更好的方法(请参见Transient Attributes),但这说明了我的观点。您也可以想象采用Encodable(组成的两个协议之一Codable-您能猜出另一个的名称吗?)将托管对象实例直接转换为JSON以进行共享,但是您必须指定编码键和自己的自定义encode实现,它不会由编译器使用自定义编码键自动合成。在这种情况下,你要指定唯一要列入键(属性)。希望这可以帮助。

ibeautiful

Swift 4.2:按照casademora的解决方案,guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError() }应该guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { fatalError() }。这样可以防止Xcode错误地将其识别为数组切片问题。编辑:使用隐式解包的可选选项,无需.context每次使用时都强制解开。
打开App,查看更多内容
随时随地看视频慕课网APP