旧核心数据模型被加载到设备上,正确的是在模拟器上

时间:2014-04-11 13:00:59

标签: ios xcode core-data

我刚刚更新到Xcode 5.1,现在当我在设备上运行我的应用程序(调试或临时发行版)时,它使用的是我的CoreData模型的旧版本。当我在我的模拟器上运行应用程序时,它使用我的模型的最新,正确的版本。问题发生在运行7.0.x和7.1的iPad上,我没有6.x进行测试。

问题出现在控制台中有一个无法识别的选择器消息: - [SiteCD setHasSynced:]:无法识别的选择器发送到实例0x147237c0

然后该应用程序停止响应,并且它不会继续执行下一行代码。

我从设备中抓取了应用程序文件,并检查了设备上的sqlite文件。确实,它缺少模型中的 hasSynced 属性。 CREATE TABLE ZSITECD(Z_PK INTEGER PRIMARY KEY,Z_ENT INTEGER,Z_OPT INTEGER,ZSITEID INTEGER,ZADDRESS1 VARCHAR,ZADDRESS2 VARCHAR,ZADDRESS3 VARCHAR,ZFULLNAME VARCHAR,ZSITEDESCRIPTION VARCHAR);

以下是在我的模拟器上运行的模型: CREATE TABLE ZSITECD(Z_PK INTEGER PRIMARY KEY,Z_ENT INTEGER,Z_OPT INTEGER, ZHASSYNCED INTEGER ,ZSITEID INTEGER,ZADDRESS1 VARCHAR,ZADDRESS2 VARCHAR,ZADDRESS3 VARCHAR,ZFULLNAME VARCHAR,ZSITEDESCRIPTION VARCHAR);

我已经验证我的活动模型版本设置正确,我已经googled,堆栈溢出,并搜索Apple论坛。我完全失去了,我很感激社区给你的任何建议。

有没有办法找出应用程序在运行时使用的模型版本? 我没有收到构建警告来更新此项目的项目设置,有没有办法手动触发该消息? 我尝试过清洁/重建。 我的设备上的应用程序以前使用我最新的模型版本(使用Xcode 5.0.x构建的应用程序)运行,然后再安装最近的应用程序版本(使用Xcode 5.1构建)。

更新我重新安装了Xcode 5.0.2并使用它构建了相同的应用程序并在我的设备上运行它。该模型回到了最新的模型。然后我使用Xcode 5.1重新构建了应用程序,仍然加载了旧/不正确的模型。今晚我将尝试更多Marcus的建议。

再次更新我从应用程序包中提取了模型属性文件,并发生了一些非常好奇的事情。 Xcode 5.1版本缺少版本密钥。第一个屏幕截图是5.0.2版本,第二个屏幕截图是5.1版本。所以现在我看到了什么是错的,但我仍然不知道相同的代码是如何发生的。

correct version properties (5.0.2) missing version key (5.1)

2 个答案:

答案 0 :(得分:1)

在运行时,您可以检查NSManagedObjectModel以查看实体的哈希值。您可以将它们与在模拟器上运行的相同应用进行比较。

听起来好像你的设备上有构建问题。如果你有一个预版本模型(只有一个.mom),现在有一个版本化模型(里面有.mom文件的.momd文件夹),它可能会导致混淆核心数据。

一些解决方案:

  1. 在创建NSManagedObjectModel实例时指定文件名,而不是仅仅抓取所有模型。
  2. 从设备中删除应用并安装新鲜以确保您没有旧文件。
  3. 手动检查正在推送的捆绑包,看看您的模型文件是否有多个副本。
  4. 更新

    1. 我建议您将其更改为使用-mergedModelFromBundles:nil,而不是使用-initWithContentsOfURL:,这样就可以消除应用程序结构中某处存在旧模型文件的可能性。

    2. 如果删除并重新安装并未清除它,那么您可能会错误地将旧文件编译到项目中。另一个考虑因素是如何构建Core Data堆栈。您是否正在检查所有可能的错误并正确报告它们,以便您可以查看堆栈创建是否存在故障?每个error:都应该有一个指针传入其中,并且应该检查方法的响应是否存在错误情况。如果您不检查核心数据中的许多错误,可以保持沉默。

    3. 我不是建议检查模型,而是实际打开应用程序软件包并检查它是否有任何文件。在您的构建中,可以在版本化目录之外编译.mom,这可能会导致问题。

答案 1 :(得分:0)

我安装了Xcode 5.1.1,问题神秘地消失了。我从来没有能够找到根本原因或解决方案,我很高兴现在它不再是一个问题。感谢Marcus的所有帮助,我希望我有更好的答案,我希望它永远不会再出现。