在用户不知情的情况下使用核心数据更改动态模式
Dynamic shcema changing using coredata without user knowing about it
嗨,我是 objective-c Coredata
的新手
这是场景。
我有一个模型说 Vehicle,其属性为 name、noOfWheels。我在我的应用程序中对此模型执行 CRUD 操作。在应用程序启动时,我拨打服务电话以检查模型是否发生变化。如果型号有变化,like
1) 新的 属性 company 已添加到 Vehicle 模型和
2) 添加了一个名为 Company 的新模型,其属性为 name、country 等
是否可以在用户不知道更新的情况下以编程方式读取这些更改并更改我的架构?
我已经在 coredata 中进行了轻量级迁移,但他们说我们需要使用 xcode 创建其他 xcdatamodel,然后以编程方式更改应用程序中的版本控制。
PS:我不想作为更新重新发布该应用程序。想动态地做。
这并非不可能,但绝非易事。您在模型编辑器中所做的一切 都可以 在代码中完成,但它会很快变得丑陋。
- 您可以修改模型。请注意,例如
NSManagedObjectModel
上的 entities
属性 是 read/write,因此您可以更改它。 properties
属性 on NSEntityDescription
也是如此
- 如果您确实要更改模型,您绝对必须在加载任何数据之前进行这些更改。加载数据后,您必须认为模型已修复,因为如果您进行新的更改,您的应用程序将会崩溃。
- 如果您更改模型,您还必须仍然使用模型迁移。如果修改后的模型与持久存储文件中的不匹配,则需要迁移。
Core Data 的真正设计假设是您将拥有一个固定的数据模型,不需要比更新应用程序更频繁地更改。它期望您可以很好地规划数据模型以使其正常工作。如果您做不到,有以下几种可能性:
- 不要使用Core Data,直接使用SQLite。 SQLite 不关心您是否更新表格。 Core Data 对许多人来说很方便,但它不是 SQL,而 SQL 可能正是您在这里需要的。
- 与其尝试在代码中修改您的数据模型,不如创建修改后的版本并将 that 上传到您的服务器。不要告诉应用程序添加新的 属性 或实体——让应用程序下载新版本的数据模型。您仍然需要进行模型迁移。
无论您如何处理,像这样即时更改数据模型都充满了危险。假设您添加了您提到的 Company
信息。然后怎样呢?您的代码不知道如何处理它,那么即使您拥有这些数据又有什么不同呢?不改代码就不能用好新数据,不更新应用就不能改代码。
嗨,我是 objective-c Coredata
的新手这是场景。
我有一个模型说 Vehicle,其属性为 name、noOfWheels。我在我的应用程序中对此模型执行 CRUD 操作。在应用程序启动时,我拨打服务电话以检查模型是否发生变化。如果型号有变化,like
1) 新的 属性 company 已添加到 Vehicle 模型和
2) 添加了一个名为 Company 的新模型,其属性为 name、country 等
是否可以在用户不知道更新的情况下以编程方式读取这些更改并更改我的架构?
我已经在 coredata 中进行了轻量级迁移,但他们说我们需要使用 xcode 创建其他 xcdatamodel,然后以编程方式更改应用程序中的版本控制。
PS:我不想作为更新重新发布该应用程序。想动态地做。
这并非不可能,但绝非易事。您在模型编辑器中所做的一切 都可以 在代码中完成,但它会很快变得丑陋。
- 您可以修改模型。请注意,例如
NSManagedObjectModel
上的entities
属性 是 read/write,因此您可以更改它。properties
属性 onNSEntityDescription
也是如此 - 如果您确实要更改模型,您绝对必须在加载任何数据之前进行这些更改。加载数据后,您必须认为模型已修复,因为如果您进行新的更改,您的应用程序将会崩溃。
- 如果您更改模型,您还必须仍然使用模型迁移。如果修改后的模型与持久存储文件中的不匹配,则需要迁移。
Core Data 的真正设计假设是您将拥有一个固定的数据模型,不需要比更新应用程序更频繁地更改。它期望您可以很好地规划数据模型以使其正常工作。如果您做不到,有以下几种可能性:
- 不要使用Core Data,直接使用SQLite。 SQLite 不关心您是否更新表格。 Core Data 对许多人来说很方便,但它不是 SQL,而 SQL 可能正是您在这里需要的。
- 与其尝试在代码中修改您的数据模型,不如创建修改后的版本并将 that 上传到您的服务器。不要告诉应用程序添加新的 属性 或实体——让应用程序下载新版本的数据模型。您仍然需要进行模型迁移。
无论您如何处理,像这样即时更改数据模型都充满了危险。假设您添加了您提到的 Company
信息。然后怎样呢?您的代码不知道如何处理它,那么即使您拥有这些数据又有什么不同呢?不改代码就不能用好新数据,不更新应用就不能改代码。