如果可以从服务器重新创建/下载应用程序中的数据,那么这是一个很好的解决方案。据我了解,您正在从服务器获取数据,这是一个很好的案例,这意味着可以在新数据库中重新创建旧数据。您不需要设置迁移堆栈,有一个非常快速的解决方案。诀窍是删除旧的 sqlite 数据库并创建一个新数据库。
这是我在应用程序更新中使用的代码。您需要将其添加到您的 AppDelegate.m
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourDatabase.sqlite"];
NSManagedObjectModel *managedObjectModel = [self managedObjectModel];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel];
// 检查我们是否已经有一个持久存储
if ( [[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]] ) {
NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error];
如果(!existingPersistentStoreMetadata){
// 持久存储发生了*真的*糟糕的事情
//[NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error];
NSLog(@"读取持久存储 %@ 的元数据失败:%@", storeURL, error);
}
if ( ![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata] ) {
if ( ![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error] )
NSLog(@"*** 无法删除持久化存储,%@", 错误);
} // 否则现有的持久存储与当前模型兼容 - 很好!
} // 否则还没有数据库文件
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
配置:无
网址:商店网址
选项:无
错误:&错误];
返回_persistentStoreCoordinator;
}
此代码涵盖问题
- 如果现有数据库是旧数据库,则删除并设置新数据库。
- 如果还没有数据库(用户只下载最新版本)而不是创建新数据库。
- 如果现有数据库与新数据库兼容,只需使用它即可。
只需将 @"YourDatabase.sqlite" 更改为您的 sqliteDB 文件名,它就可以正常工作。