0

我在我的应用程序中使用 Core Data 来实现持久性。除此之外,我正在使用自定义迁移并创建一个新的 sqlite 文件。我在 app 版本 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:(我的代码的最后一行),整个过程也是成功的,我认为这是一个必要的步骤,因为我的数据库文件位置已经改变,但persistentStoreCoordinator 尚未更新。谁能告诉persistentStoreCoordinator 是如何自己更新的或者代码为什么工作的?

4

1 回答 1

0

大概是因为 sqlite 文件已经打开了。在 Unix 下,假设相同的文件系统,在您将文件移动到新位置(并且将在新位置正确读/写)后,任何现有文件句柄仍然有效。

但是,危险在于它不一定只是 .sqlite 文件 - sqlite 还使用其他文件,例如 WAL 文件,这些文件仍然具有旧名称(如果您打算覆盖它们,这将是一个问题)。

于 2014-01-14T11:00:49.243 回答