托管对象之外的 NSManagedObject 子类作为普通对象

Posted

技术标签:

【中文标题】托管对象之外的 NSManagedObject 子类作为普通对象【英文标题】:NSManagedObject subclass outside of managed object as a normal object 【发布时间】:2009-09-02 06:24:21 【问题描述】:

我有一个带有国家名称和国家代码的实体对象 Country。它是 NSManagedObject 的子类,我将它与核心数据模型一起使用以将其值存储到持久存储中。

我有一个地方可以将相同的 Country 对象用作普通对象,即我将使用它来存储一些临时国家/地区名称。

为此,我将国家/地区初始化如下

[NSManagedObject alloc] init]

初始化成功完成,但我无法为该对象设置任何属性。 于是我做了一个探索。我发现,根据文档,不支持 NSManagedObject 的 init。

我不知道如何将 NSManagedObject Country 与 CoreData 以及普通对象一起使用。

【问题讨论】:

【参考方案1】:

NSManagedObject 类文档概述的第二段:

一个托管对象与一个 实体描述(一个实例 NSEntityDescription) 提供 关于对象的元数据(包括 对象的实体名称 代表及其名称 属性和关系)和 跟踪的托管对象上下文 对象图的变化。这是 托管对象很重要 正确配置为与 Core 一起使用 数据。 如果您实例化一个托管 直接对象,您必须调用 指定初始化器 (initWithEntity:insertIntoManagedObjectContext:)。

来自方法的文档:

重要提示:此方法是 指定的初始化器 NSManagedObject。你不应该 简单地初始化一个托管对象 发送它初始化。

文档其实很好。

您不想尝试在可行的 CoreData 堆栈之外使用 NSManagedObject。 NSManagedObjects 非常明确地设计为在正确配置的核心数据环境中工作。如果您需要一个临时实例,您可以创建一个内存存储或在您的常规存储中创建一个,并且在不先将其删除之前不要保存更改。

【讨论】:

谢谢!!所以不可能像我们对普通对象那样进行初始化。我想您指的是 NSInMemoryStoreType 用于持久存储,因此插入的实体将存储在易失性 RAM 内存中。我还有一个问题 - 它什么时候会被清除,还是我们必须手动清除它? 当你告诉它清除(手动)或当你的应用程序退出时它会被清除...... InMemoryStores 就像其他商店一样工作,只是持久性......只在内存中。 【参考方案2】:

使用initWithEntity:insertIntoManagedObjectContext: 并为托管对象上下文传递nil

【讨论】:

以上是关于托管对象之外的 NSManagedObject 子类作为普通对象的主要内容,如果未能解决你的问题,请参考以下文章

从托管对象上下文中删除后使用保留的 NSManagedObject 是不是安全?

获取核心数据中 NSManagedObject 的修改日期?

如何在单个托管对象上下文中初始化新的 NSManagedObject 并设置与另一个 NSManagedObject 的关系?

子类化一个 NSManagedObject 子类

管理 NSManagedObject

swift / Core Data - 为数据模型创建“虚拟”NSManagedObject(无需托管对象即可测试事物)