CoreData数据管理造成Crash:Can't find model for source store

场景再现:上线后出现大量crash,crash发生在iOS8及以下设备中。

CoreData数据管理造成Crash:Can't find model for source store_第1张图片
bug.png

CoreData数据管理造成Crash:Can't find model for source store_第2张图片
devices.png

问题解决:真机直接调试没问题,没有crash。后来只能在release下进行调试。首先去处release的debug限制,再通过window下的diveces可以显示显示release下的崩溃内容。

CoreData数据管理造成Crash:Can't find model for source store_第3张图片
show.png

显示主要错误内容如下:

: Unresolved error Error Domain=NSCocoaErrorDomain Code=134130 "未能完成操作。(“Cocoa”错误 134130。)" UserInfo=0x17447f100 {URL=file:///var/mobile/Containers/Data/Application/E59D1C45-4F51-41FC-B0D8-DEB452DBDB1F/Documents/XXXX.sqlite, metadata={
        NSPersistenceFrameworkVersion = 519;
        NSStoreModelVersionHashes =     {
            XXXBusiness = <7024b9dd acac8a71 eca7af3d 4cfa26ad 7fcf2eb5 d98c5695 2d28c245 be849b55>;
            XXXCity = ;
            XXXProfile = ;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =     (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "D17A5417-1823-43E2-A6CE-6E146962F01D";
        "_NSAutoVacuumLevel" = 2;
    }, reason=Can't find model for source store}

结合代码改动,我们推断定是coredata使用过程中出现了问题,初步判断是升级中出现了某些问题,因为这个版本在表中增加了字段。
检查相关代码,查看coredata设置,都没发现什么明显的错误。最后重新模拟升级数据库的过程,终于发现了问题。在开发的时候,
偷懒直接将需要升级的字段写到了coredata中,后来升级coredata的XXXProfile表结构,由于粗心外加代码没有很熟悉,没有将老表中的字段清理干净,
剩了两个字段在老版本的coredata中。这样如崩溃信息所显示的,APP升级后,coredata发现:新代码中,老表结构的hash值,与本地现存老表结构的hash值不一样。
这就出现了“Can't find model for source store”的提示,即“没有发现模型的源存储”。iOS8以下系统没有相关的容错处理,直接抛出了错误,造成了crash。

总结教训:我们以后coredata的表结构升级,开发时就先建好新的模型,然后在新的模型中进行相关的操作。

你可能感兴趣的:(CoreData数据管理造成Crash:Can't find model for source store)