ios - 应用程序更新后的Coredata

标签 ios core-data

我正在尝试为我的应用程序实现一个过程,该过程使得可以在需要时更新应用程序,并且通过更新我的意思是将新的应用程序.ipa加载到设备中。

事实是,我正在使用CoreData来存储首次启动时带来的服务器数据,并且在旧版本和新版本之间,我添加了一些实体并将某些旧实体分配给数据库。这引起了冲突,因为我不知道如何处理迁移和/或任何可以让我随着结构的变化而重新创建数据库的功能。

目前,如果我使用相同的数据库结构更新应用程序,则该应用程序可以正常运行,但是如果我对其进行了修改,则该应用程序将崩溃,如预期的那样。

有什么想法吗?

最佳答案

如果可以从服务器重新创建/下载应用程序中的数据,那么这是一个很好的解决方案。
据我了解,您正在从服务器获取数据,这是一个很好的例子,这意味着可以在新数据库中重新创建旧数据。
您不需要设置迁移堆栈,这是一个非常快速的解决方案。诀窍是删除旧的sqlite数据库并创建一个新的sqlite数据库。

这是我在应用程序更新中使用的代码。
您需要在AppDelegate.m中添加它

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
NSURL * storeURL = [[自身applicationDocumentsDirectory] ​​URLByAppendingPathComponent:@“YourDatabase.sqlite”];
NSManagedObjectModel * managedObjectModel = [selfmanagedObjectModel];
NSError *错误=无;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];

//检查我们是否已经有一个持久存储
如果([[[NSFileManager defaultManager] fileExistsAtPath:[storeURL路径]]){
NSDictionary * existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL错误:&error];
如果(!existingPersistentStoreMetadata){
//永久存储发生了“真正的”坏事
// [NSException引发:NSInternalInconsistencyException格式:@“无法读取持久存储%@的元数据:%@”,storeURL,错误];
NSLog(@“无法读取持久性存储%@的元数据:%@”,storeURL,错误);
}

如果(![managedObjectModel isConfiguration:nilcompatibleWithStoreMetadata:existingPersistentStoreMetadata]){
如果(([[NSFileManager defaultManager] removeItemAtURL:storeURL错误:&error])
NSLog(@“***无法删除持久性存储,%@”,错误);
} //其他现有的持久性存储与当前模型兼容-很好!
} //否则没有数据库文件

[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
配置:无
网址:storeURL
选项:无
错误:&错误];
返回_persistentStoreCoordinator;
}



此代码涵盖了问题

  • (如果现有数据库是旧数据库),则删除并设置新数据库。
  • (如果尚无数据库)(用户仅下载最新版本),而不是创建新数据库。
  • 如果现有数据库与新数据库兼容,则使用

  • 只需将@“YourDatabase.sqlite”更改为sqliteDB文件名,它将可以正常工作。

    关于ios - 应用程序更新后的Coredata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19790558/

    相关文章:

    c++ - iOS中Opencv人脸检测Cascade编译器报错

    ios - ionic/cordova 项目中的 Xcode 设备列表为空

    iphone - 核心数据的数据迁移

    xcode - 如何在 Xcode 中删除旧的/未使用的数据模型版本

    ios - Xcode DispatchQueue.main.async 在大循环内部还是外部?

    ios - 添加为另一个 View 的 subview 时未调用 touchesBegan 方法

    ios - 将自定义框架链接到 xcode 中的库

    ios - 核心数据 - 带where条件的嵌套总和

    ios - Firebase Flutter 使用 Apple 登录导致应用程序崩溃

    core-data - 水平 ScrollView 可滑动核心数据对象