我正在尝试为我的应用程序实现一个过程,该过程使得可以在需要时更新应用程序,并且通过更新我的意思是将新的应用程序.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/