【发布时间】:2014-08-01 15:03:48
【问题描述】:
我在 AppStore 上有一个应用程序,它于 12 月 13 日使用 Xcode 4.3 提交,它有一个核心数据模型(版本 2)。我现在要发布更新了核心数据模型的下一个版本。当我在调试模式下运行代码时,迁移工作正常。但是,当我通过 TestFlight 进行发布时,迁移失败并且出现以下错误。出于安全原因,每次应用程序退出时我都会删除数据库(我保存一个加密副本),并在下次启动时解密这个数据库。
用于初始化 PersistentStoreCoordinator 的代码。
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
// Check if we need a migration
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
NSManagedObjectModel *destinationModel = [_persistentStoreCoordinator managedObjectModel];
BOOL isModelCompatible = (sourceMetadata == nil) || [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata];
if (! isModelCompatible) {
// We need a migration, so we set the journal_mode to DELETE
options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES,
NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}
};
}
NSPersistentStore *persistentStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
if (! persistentStore) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [paths objectAtIndex:0];
NSString *databasePath = [documents stringByAppendingPathComponent:@"Store"];
NSString *sqlite = [databasePath stringByAppendingPathComponent:@"myDatabase.sqlite"];
[[NSFileManager defaultManager] removeItemAtPath:sqlite error:nil];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
//abort();
}
// Reinstate the WAL journal_mode
if (! isModelCompatible) {
[_persistentStoreCoordinator removePersistentStore:persistentStore error:NULL];
options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES,
NSSQLitePragmasOption: @{@"journal_mode": @"WAL"}
};
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
}
return _persistentStoreCoordinator;
当我尝试初始化 persistentStoreCoordinator 时,我收到以下错误。
未解决的错误 Error Domain=NSCocoaErrorDomain Code=259 “操作无法完成。(Cocoa 错误 259。)” UserInfo=0x15df4dc0 {NSUnderlyingException=路径中的文件似乎不是 SQLite 数据库:/var/mobile /Applications/9B623099-5591-4C55-BA83-77A057B94690/Documents/Store/myDatabase.sqlite},{
NSUnderlyingException = "File at path does not appear to be a SQLite database: /var/mobile/Applications/9B623099-5591-4C55-BA83-77A057B94690/Documents/Store/myDatabase.sqlite";}
奇怪的是,在 iOS7.0.6 上,升级方案在 Dev 和 Release 配置上都运行良好,但在 iOS7.1 上它似乎只在 Dev 配置上运行。我也厌倦了删除 WAL 和 SHM 文件,但无济于事。
【问题讨论】:
标签: sqlite core-data keychain ios7.1 core-data-migration