【问题标题】:Continue using NSManagedObject types but migrate off Core Data继续使用 NSManagedObject 类型,但从 Core Data 迁移
【发布时间】:2021-10-02 16:56:56
【问题描述】:

我正在处理使用 Core Data 的大量现有代码库。

我有扩展 NSManagedObject 并保留在 Core Data 中的类型。

我需要完全迁移出 Core Data(原因不重要,但我有充分的理由)。但是,我有一个基本的限制。

  • 我无法将这些类型更改为 NSObject(某些用例必须继续使用 Core Data)。
  • 这些 NSManagedObject 类型在我的业务逻辑中大量传递。我不想重构该业务逻辑并引入新的/“非托管”类型。

假设我有一些类型Foo,它是一个 NSManagedObject。我试过类似的东西:

Foo *foo = [[Foo alloc] init];
foo.name = "beebunny";

foo.name 调用导致崩溃。

name@dynamic 并且有一个自定义设置方法,例如:

- (void)setFoo:(Foo *)fooIn
{
    [self setFoo:fooIn];
}

[self setFoo:fooIn]; 调用导致异常(未知选择器)。

如果我正在使用任何扩展 NSManagedObject 的类型,我似乎必须使用 Core Data。

对于我想要关闭核心数据的迁移类型,是否有合适/推荐的模式?

【问题讨论】:

  • “迁移出 CoreData”是什么意思?是否希望停止持久化数据?
  • 我将继续在持久存储中持久化数据。我将不再使用 Core Data,而是使用售卖的库。

标签: ios core-data nsmanagedobject


【解决方案1】:

NSManagedObject 的实例在很大程度上依赖于数据模型。您不必使用 Core Data 保存实例,但它们必须有数据模型支持它们,否则它们将无法工作。您的 [[Foo alloc] init] 不起作用,因为 (a) 它没有使用指定的初始化程序,并且 (b) 它没有支持它的数据模型。

您可以创建不保存的实例。例如,您可以使用-initWithEntity:insertIntoManagedObjectContext: 创建实例,但上下文参数为NULL。除非你插入它,否则它永远不会被保存,但听起来你不会那样做。但是该初始化程序需要NSEntityDescription,并且您需要从托管对象模型中获取它。 (您也可以在代码中创建它们,但这不会更容易或消除将核心数据导入代码的需要)。

简而言之,您不必将这些对象保存到 Core Data,但如果您仍要继承 NSManagedObject,则确实需要一些 Core Data 支持。您不能独立于数据模型使用这些类。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多