アプリの永続化に Core Data を使用しています。その上で、カスタム マイグレーションを使用し、新しい sqlite ファイルを作成しています。アプリのバージョン 1 でsqlite ファイルにproject.sqliteという名前を付けていましたが、カスタム移行後、新しい sqlite ファイルにprojectNew.sqliteという名前を付けました。データのカスタム移行後、古い sqlite ファイルを削除し、新しい sqlite ファイルの名前を古い名前に変更します。つまり、project.sqlite を削除し、 projectNew.sqliteをproject.sqliteに名前変更します。
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:options
error:&error])
{
DLog(@"%@",error);
}
else
{
NSString* newDBfile = [storePath stringByAppendingPathComponent:@"projectNew.sqlite"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:newDBfile];
if (fileExists) {
NSString* oldDBfile = [storePath stringByAppendingPathComponent:@"project.sqlite"];
if ([fileManager removeItemAtPath:oldDBfile error:&error] != YES)
{
NSLog(@"Unable to delete file: %@", [error localizedDescription]);
}
NSString *newPath = [storePath stringByAppendingPathComponent:@"project.sqlite"];
// Attempt the move
if ([fileManager moveItemAtPath:newDBfile toPath:newPath error:&error] != YES)
{
NSLog(@"Unable to move file: %@", [error localizedDescription]);
}
if (![persistentStoreCoordinator setURL:[NSURL fileURLWithPath:newPath] forPersistentStore:[persistentStoreCoordinator persistentStoreForURL:storeUrl]])
{
DLog(@"Persistent store not changed");
}
}
このプロセス全体はsetURL:forPersistentStore:
、DB ファイルの場所が変更されたが、persistentStoreCoordinator がまだ更新されていないため、必要な手順であると思われる (コードの最後の行) を呼び出さなくても成功します。persistentStoreCoordinator 自体がどのように更新されているか、またはコードが機能している理由を誰か教えてもらえますか?