为现有实体创建新的 CoreData 属性时 Swift 崩溃

Posted

技术标签:

【中文标题】为现有实体创建新的 CoreData 属性时 Swift 崩溃【英文标题】:Swift crashes when creating a new CoreData Attribute to an existing entity 【发布时间】:2016-08-02 09:30:19 【问题描述】:

我正在尝试在 swift 中以编程方式为现有的实体创建一个新的属性。 这是我的代码:

    let model = NSManagedObjectModel()
    var properties = Array<NSAttributeDescription>()
    let remoteURLAttribute = NSAttributeDescription()
    remoteURLAttribute.name = "\(foundArray[indexPath.row]) id"
    remoteURLAttribute.attributeType = .stringAttributeType
    remoteURLAttribute.isOptional = false
    remoteURLAttribute.isIndexed = true
    properties.append(remoteURLAttribute)
    entity?.properties = properties
    model.entities = [entity!]

应用程序总是因为这个错误而崩溃:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'不能修改不可变的 模型。'

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您只能在使用数据模型读取或存储数据之前更改数据模型。当你第一次加载它时它是可变的,但一旦你将它用于模型编辑以外的任何东西,它就会变得不可变。

像这样更改模型通常是个坏主意。但如果出于某种原因需要,您必须在使用模型加载或保存任何数据之前执行此操作。

【讨论】:

你是对的,但我想为已经存在的实体添加一个新属性。我该怎么做? 通常的方式是create a new version of the model file and do model migration。可以在代码中修改模型,但非常不寻常,即便如此,您仍然需要进行模型迁移。 那么哪个是最好的选择:创建一个新模型还是找到另一种方法而不创建新属性? 这不是“新”模型,它是同一模型的新版本。 Xcode 和 Core Data 内置了对同一模型文件的多个版本的支持。这是最好的,也是迄今为止最常见的方式。在您的情况下,创建一个添加此新属性的新模型版本。 我可以遵循这个 (developer.apple.com/library/ios/recipes/…) 指南吗?【参考方案2】:

模型在运行时不可编辑。见documentation,段落Editing Models Programmatically。您只能复制它并进行更改。

【讨论】:

【参考方案3】:

我实际上并没有尝试过,但是如何将模型从常量更改为变量(即 var 而不是 let)。

【讨论】:

以上是关于为现有实体创建新的 CoreData 属性时 Swift 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在创建新实体之前检查现有实体

在 Core Data 中为实体添加属性

Swift & Core Data - 将实体添加到现有实体

未显示新的 CoreData 版本属性

核心数据 - 编辑、递增和保存属性到现有实体

添加新属性时,CoreData 无法完成错误