您可以在运行时修改 Core Data 模型吗?是的...但是,它可能无法按照您希望的方式工作。
Core Data 的 API 使得在运行时构建或修改数据模型的每个细节成为可能。Xcode 的模型编辑器很方便,但如果您愿意,您可以跳过它并在代码中执行所有操作。例如,NSEntityDescription
的properties
属性(包括属性和关系)是可写的。您可以创建一个新NSAttributeDescription
实体并更新实体的属性以包含它。Bang,您刚刚为实体添加了一个新属性。同样,NSManagedObjectModel
的entities
属性是可写的,因此您可以创建一个新属性NSEntityDescription
并将其添加到模型中。这为您提供了一个在运行时创建的新实体。
但是,这是一个大问题:您只能在加载数据存储之前执行此操作。加载持久存储后,更改模型将引发异常。当 Core Data 加载持久存储时,它会将模型文件与存储文件中使用的模型进行比较。它们必须匹配,加载商店后您无法更改此事实。加载商店后,模型就固定了。
更重要的是,即使您在加载持久存储之前修改了模型,也只能加载与模型当前版本匹配的持久存储——除非您还编写代码将持久存储迁移到新模型。这有多难取决于变化的性质。至少,您需要在加载之前保存的数据之前进行任何更改,然后还安排进行模型迁移以更新持久存储以使用新模型。
使用 Core Data,模型(模式)和数据是分开存储的,并在加载存储时匹配。这不是 SQLite 在内部工作的方式,而是 Core Data 强制执行的方法。