Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新iOS核心数据版本以避免崩溃_Ios_Core Data_Core Data Migration - Fatal编程技术网

更新iOS核心数据版本以避免崩溃

更新iOS核心数据版本以避免崩溃,ios,core-data,core-data-migration,Ios,Core Data,Core Data Migration,我更新了iOS应用程序,其中包括对核心数据模型进行了一些更改。然后,在我将新版本上传到应用商店,人们开始尝试使用它之后,应用程序崩溃了 我现在明白了,这是因为用户在他们的设备上有旧的核心数据模型,它与新的不兼容。我已经读到我应该更新模型版本,所以现在这就是我正在做的 我对此有点紧张,因为我读到我应该在做出更改之前更新模型版本。很明显,我不能回到过去——更改已经完成,而且在更改之前我没有更新外翻。那么,现在只需更改模型版本,并期望它在我的用户设备上正常工作而不会崩溃,这样可以吗?或者我还可以/必须

我更新了iOS应用程序,其中包括对核心数据模型进行了一些更改。然后,在我将新版本上传到应用商店,人们开始尝试使用它之后,应用程序崩溃了

我现在明白了,这是因为用户在他们的设备上有旧的核心数据模型,它与新的不兼容。我已经读到我应该更新模型版本,所以现在这就是我正在做的

我对此有点紧张,因为我读到我应该在做出更改之前更新模型版本。很明显,我不能回到过去——更改已经完成,而且在更改之前我没有更新外翻。那么,现在只需更改模型版本,并期望它在我的用户设备上正常工作而不会崩溃,这样可以吗?或者我还可以/必须做其他事情吗


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

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

为了防止用户应用程序崩溃,您可以删除旧的sqlite文件,并使用更新的模型生成新的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文件

您可以执行类似于此代码的操作。请注意,这将在每次应用程序无法打开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
        }
    }
}

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


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

Swift 3

斯威夫特3


谢谢我将要查看该链接。如何删除sqlite文件并生成一个新文件?您必须在代码中搜索创建sqlite文件的路径,然后使用NSFileManager将其删除这很好。现在,每当它崩溃时,它都会替换sqlite文件,并可以正常工作,尽管使用的是一个新的空数据库。谢谢现在我需要确保应用程序不再需要运行此代码!谢谢我将要查看该链接。如何删除sqlite文件并生成一个新文件?您必须在代码中搜索创建sqlite文件的路径,然后使用NSFileManager将其删除这很好。现在,每当它崩溃时,它都会替换sqlite文件,并可以正常工作,尽管使用的是一个新的空数据库。谢谢现在我需要确保应用程序不再需要运行此代码!好的,我需要做一个迁移。我在做了更改之后而不是之前制作了新版本,这有关系吗。您必须先创建新版本,然后进行更改。2.上传更新后的应用程序时,您必须保留两个版本。好的,所以我需要进行迁移。我在做了更改之后而不是之前制作了新版本,这有关系吗。您必须先创建新版本,然后进行更改。2.上传更新后的应用程序时,必须同时保留两个版本。