在用户不知情的情况下使用核心数据更改动态模式

Posted

技术标签:

【中文标题】在用户不知情的情况下使用核心数据更改动态模式【英文标题】:Dynamic shcema changing using coredata without user knowing about it 【发布时间】:2016-06-21 12:33:22 【问题描述】:

您好,我是 Objective-c Coredata 的新手

这里是场景。 我有一个模型说 Vehicle 具有 namenoOfWheels 属性。我在我的应用程序中对此模型执行 CRUD 操作。在应用程序启动时,我会进行服务调用以检查模型是否更改。如果模型有变化,比如 1) company 新属性已添加到 Vehicle 模型和 2) 添加了一个名为 Company 的新模型,具有 namecountry 等属性。

是否有可能在用户不知道更新的情况下以编程方式读取这些更改并更改我的架构?

我已经在 coredata 中进行了轻量级迁移,但他们说我们需要使用 xcode 创建其他 xcdatamodel,然后以编程方式更改应用程序中的版本。

PS:我不想重新发布该应用程序作为更新。想要动态地做到这一点。

【问题讨论】:

【参考方案1】:

这并非不可能,但绝非易事。您在模型编辑器中所做的一切可以在代码中完成,但它会很快变得丑陋。

您可以修改模型。例如,请注意 NSManagedObjectModel 上的 entities 属性是读/写的,因此您可以更改它。 NSEntityDescription 上的 properties 属性也是如此。 如果您确实更改了模型,您绝对必须在加载任何数据之前进行这些更改。加载数据后,您必须考虑修复模型,因为如果您进行新的更改,您的应用将会崩溃。 如果您更改模型,您还必须使用模型迁移。如果修改后的模型与持久存储文件中的内容不匹配,则需要进行迁移。

Core Data 的设计确实假设您将拥有一个固定的数据模型,该模型不需要比更新应用程序更频繁地更改。它希望您能够很好地规划数据模型以使其正常工作。如果你不能这样做,有几种可能性包括:

    不要使用Core Data,直接使用SQLite。 SQLite 不在乎你是否更新表。 Core Data 对许多人来说是一种便利,但它不是 SQL,而 SQL 可能正是您需要的。 与其尝试在代码中修改您的数据模型,不如创建一个修改后的版本并将上传到您的服务器。不要告诉应用添加新的属性或实体——让应用下载新版本的数据模型。您仍然需要进行模型迁移。

无论您如何处理,像这样动态更改数据模型都充满危险。假设您添加了您提到的Company 信息。然后怎样呢?您的代码不知道如何处理它,那么您甚至拥有这些数据有什么区别?不更改代码就无法充分利用新数据,不更新应用也无法更改代码。

【讨论】:

感谢汤姆的投入。我有这样的要求,我实际上并没有为最终用户编写应用程序。我正在验证我是否可以在这种情况下使用 coredata。

以上是关于在用户不知情的情况下使用核心数据更改动态模式的主要内容,如果未能解决你的问题,请参考以下文章

包含静态预填充和动态用户数据的核心数据

如何在不使用数据库的情况下重新实例化动态 ASP.NET 用户控件?

怎么使用net user 命令啊?

买了个摄像头,然后它在我不知情的情况下录制了682GB视频

如何在不刷新php页面的情况下跟踪mysql数据库中的更改?

XSS攻击