我刚刚更新到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版本。所以现在我看到了什么是错的,但我仍然不知道相同的代码是如何发生的。
答案 0 :(得分:1)
在运行时,您可以检查NSManagedObjectModel
以查看实体的哈希值。您可以将它们与在模拟器上运行的相同应用进行比较。
听起来好像你的设备上有构建问题。如果你有一个预版本模型(只有一个.mom),现在有一个版本化模型(里面有.mom文件的.momd文件夹),它可能会导致混淆核心数据。
一些解决方案:
NSManagedObjectModel
实例时指定文件名,而不是仅仅抓取所有模型。我建议您将其更改为使用-mergedModelFromBundles:nil
,而不是使用-initWithContentsOfURL:
,这样就可以消除应用程序结构中某处存在旧模型文件的可能性。
如果删除并重新安装并未清除它,那么您可能会错误地将旧文件编译到项目中。另一个考虑因素是如何构建Core Data堆栈。您是否正在检查所有可能的错误并正确报告它们,以便您可以查看堆栈创建是否存在故障?每个error:
都应该有一个指针传入其中,并且应该检查方法的响应是否存在错误情况。如果您不检查核心数据中的许多错误,可以保持沉默。
我不是建议检查模型,而是实际打开应用程序软件包并检查它是否有任何文件。在您的构建中,可以在版本化目录之外编译.mom
,这可能会导致问题。
答案 1 :(得分:0)
我安装了Xcode 5.1.1,问题神秘地消失了。我从来没有能够找到根本原因或解决方案,我很高兴现在它不再是一个问题。感谢Marcus的所有帮助,我希望我有更好的答案,我希望它永远不会再出现。