想要保存核心数据,但“扩展不得包含存储的属性”

Posted

技术标签:

【中文标题】想要保存核心数据,但“扩展不得包含存储的属性”【英文标题】:Want to save Core Data but "Extensions must not contain stored properties" 【发布时间】:2020-11-27 23:04:25 【问题描述】:

我有一个名为“CloudPage”的核心数据类,我在我的代码中为它添加了一个扩展:

extension CloudPage:GalleryItem 
    // bunch of methods defined here
    func someFunc() -> Bool 
        return true
    

对我来说扩展这个类来让所有模型信息都驻留在这里是有意义的。我还认为这个类知道如何保存自己的实例是有意义的,所以我将我的 viewcontext 添加到它:

extension CloudPage:GalleryItem 
    @Environment(\.managedObjectContext) private var viewContext

// ...some code...

但现在 swift 说“扩展不能包含存储的属性”。有一个更好的方法吗?我认为所有的保存逻辑都应该驻留在这个模型上。

【问题讨论】:

【参考方案1】:

正如编译器已经说过的,不允许在扩展中添加存储属性。 CloudPageNSManagedObject,这意味着它已经由 CoreData 管理。

无论如何这不是您使用 CoreData 对象的方式。我会澄清一些事情

这些对象在上下文中管理/加载。有两种类型的上下文

    ViewContext(应该用于查看目的) BackgroundContext(应该用于从例如后台的 API 加载内容)

如果您更新对象或添加新对象,这些对象已经存在于所述上下文中。要持久保存这些对象,您不必再像使用普通 SQL (UPDATE table...) 那样将它们“推”入其中。你只需要像

这样保存上下文
// context is the one you loaded the objects from and worked with
context.save()

希望对你有所帮助,我只是想粗略地总结一下,以便你更好地理解。不要绝望,CoreData 有它的怪癖,你会习惯的。更多详情请阅读Apples Documentation of working with Core Data。

【讨论】:

以上是关于想要保存核心数据,但“扩展不得包含存储的属性”的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据中保存和加载 xmpp 消息

将照片保存到核心数据

核心数据与许多对等关系

使用 MKMapView、核心位置和核心数据

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

核心数据保存但不保存 - 专用队列跳转线程