【问题标题】:Swift crashes when creating a new CoreData Attribute to an existing entity为现有实体创建新的 CoreData 属性时 Swift 崩溃
【发布时间】: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',原因:'不能修改不可变的 模型。'

我该如何解决这个问题?

【问题讨论】:

    标签: ios swift xcode core-data swift3


    【解决方案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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多