更新 iOS Core Data 版本以避免崩溃

Posted

技术标签:

【中文标题】更新 iOS Core Data 版本以避免崩溃【英文标题】:Update iOS Core Data Version to Avoid a Crash 【发布时间】:2015-08-14 11:20:28 【问题描述】:

我更新了我的 ios 应用程序,其中包括对 Core Data 模型进行了一些更改。然后在我将新版本上传到 App Store 并且人们开始尝试使用它后,应用程序崩溃了!

我现在明白这是因为用户在他们的设备上安装了旧的 Core Data 模型,它与新的不兼容。我已经读到我应该更新模型版本,所以现在这就是我正在做的事情。

虽然我读到我应该在进行更改之前更新模型版本,但我对此有点紧张。显然我不能回到过去 - 所做的更改已经完成,并且在我制作它们之前我没有更新外翻。那么现在可以只更改模型版本并期望它在我的用户设备上正常工作而不会崩溃,还是我可以/必须做的其他事情?

实际数据不是很重要,很快就会被替换,所以我不在乎他们是否可以保留数据。我只需要他们能够更新应用程序而不会在他们下次尝试使用它时崩溃。

【问题讨论】:

【参考方案1】:

如果您使用任何版本控制系统,您可以检索旧模型并以正确的方式进行操作,请按照此documentation 进行操作。

为了防止用户的应用程序崩溃,您可以删除旧的 sqlite 文件并使用更新的模型生成一个新的。

您可以执行与此代码类似的操作。请注意,每次您的应用无法打开时,这都会删除 sqlite 文件

__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) 

    if(error)
    
        //Erase old sqlite
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];

        //Make new persistent store for future saves 
        if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
            // do something with the error
        
    

【讨论】:

谢谢。我正要检查那个链接。我将如何删除 sqlite 文件并生成一个新文件? 你必须在你的代码中搜索你创建 sqlite 文件的路径,然后你可以使用 NSFileManager 删除它 太好了。现在,每当它崩溃时,它都会替换 sqlite 文件并且可以正常工作,尽管使用的是新的空数据库。谢谢。现在我需要确保应用不再需要运行此代码!【参考方案2】:

斯威夫特 3

    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.appendingPathComponent("name.sqlite")
    let walUrl = url.deletingPathExtension().appendingPathExtension("sqlite-wal")
    let shmUrl = url.deletingPathExtension().appendingPathExtension("sqlite-shm")
    do 
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
     catch 
        do 
            try FileManager.default.removeItem(at: url)
            try FileManager.default.removeItem(at: walUrl)
            try FileManager.default.removeItem(at: shmUrl)
            try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
         catch let error as NSError 
            //handle error
        
    

【讨论】:

【参考方案3】:

当您使用 Core Data 模型进行更改时,您必须在上传新版本之前完成完整的迁移过程。否则它只对新用户有效,老用户会崩溃。现在您必须将数据模型迁移到新版本,然后再次上传构建。 这是唯一的解决方案,更多信息请阅读此链接:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMigrationProcess.html#//apple_ref/doc/uid/TP40004399-CH6-SW1

【讨论】:

好的,所以我需要进行迁移。我在更改之后而不是之前创建新版本是否重要? 1.您必须先创建新版本,然后再进行更改。 2. 当您上传更新的应用程序时,您必须保留这两个版本。

以上是关于更新 iOS Core Data 版本以避免崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如果Core Data count / fetch请求中的实体名称错误,如何避免崩溃?

在 iOS 上处理 Core Data 数据库的频繁更新和请求的最佳实践?

iOS开发过程中使用Core Data应避免的十个错误

Core Data 可以在 iOS 上提供哪些(如果有)ACID 保证?

对象管理器 getObject:self 方法上的 RestKit 和 Core Data 实体崩溃

HMS Core分析服务6.5.0版本更新啦