为现有实体创建新的 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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章