Core Data - 如何在不将其添加到数据库的情况下创建 Core Data 对象的实例?

Core Data - How to create an Instance of Core Data object without adding it to the database?

我已经创建了 Core Data 数据库,它有一个名为 Item 的实体。

如果我想创建 Item 的实例并将其添加到数据库,我使用 Item(context: ).

创建它

如何在不将 Item 添加到 Core Data 数据库的情况下创建 Item 实例?

我尝试过类似的操作,但是应用程序崩溃了,当我 运行 此代码时:

extension Item {
    static var sampleItem: Item {
        let sampleItem = Item()
        sampleItem.timestamp = Date.now
        return sampleItem
    }
}

没有上下文(并且推而广之,没有与持久存储或托管对象模型的任何连接),核心数据无法确定对象的行为方式。

如果您对持久性或与任何实际对象的关系不感兴趣,那么您可以创建一个 in-memory 持久性存储,使用相同的托管对象模型,并在其中创建对象。这些对象也可用于单元测试和 SwiftUI 预览。

如果您对一次性但“真实”的对象感兴趣,这些对象将代表数据库中的真实事物及其关系,请创建一个子主队列上下文,其中包含您的主上下文的父级。然后您的数据库中的真实对象将可用,您可以对它们做任何您喜欢的事情。除非您保存子上下文,否则原始数据库将保持不变。

如果使用 init(entity:insertInto:) 创建实例,则可以执行此操作,因为上下文参数是可选的。这意味着您必须先查找实体描述。

您从托管对象上下文中获取描述,类似于

let itemEntity = NSEntityDescription.entity(forEntityName: "Item", 
    in: container.viewContext)!

然后你可以像这样创建一个实例:

let uninsertedItem = Item(entity: personEntity, insertInto:nil)

然后您可以使用 uninsertedItem。稍后如果你想保存它,将它插入到上下文中:

container.viewContext.insert(uninsertedItem)

如果您不想保存它,请不要这样做,让该对象被释放。