将 sqlite 文件复制到新路径后无法修改 ios

Could not modify sqlite file after copying it to new path in ios

在我的应用程序中,我有 sqlite 文件,我想将该文件复制到另一个路径。我有以下代码。但是当我复制它时,我发现所有数据都没有复制到新文件中。如果我有新文件,那么下次在复制之前我必须删除文件(用新数据替换文件)并在同一路径复制新文件。如果我再次将数据复制到新路径&如果那时所有数据都复制到新路径,我将无法修改旧的 sqlite 文件。我不明白为什么在复制所有数据后我不能修改数据库。 &我如何才能成功复制所有数据?实现这一目标的方法是什么。如果有人需要任何额外的信息,我会提供给你。

NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,
                                    NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSString *str=[NSString stringWithFormat:@"%@/XMPPMessageArchiving.sqlite",applicationSupportDirectory];//copy this file

NSString *fileName = [NSString stringWithFormat:@"XMPPMessageArchiving.sqlite"];
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];


NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];

NSURL *fromURL = [NSURL fileURLWithPath:str];
NSURL *toURL = [[ubiq URLByAppendingPathComponent:@"Documents"]
                URLByAppendingPathComponent:fileName]; 

[coordinator coordinateReadingItemAtURL:fromURL options:NSFileCoordinatorReadingForUploading writingItemAtURL:toURL options:0 error:nil byAccessor:^(NSURL *newReadingURL, NSURL *newWritingURL)
 {

     NSFileManager* fileManager = [[NSFileManager alloc] init];
     BOOL fileExists = [fileManager fileExistsAtPath:newWritingURL.path];
     if (fileExists)
     {
         [fileManager removeItemAtURL:toURL error:nil];
     }

     NSError *error=nil;
     [fileManager copyItemAtURL:newReadingURL toURL:newWritingURL error:&error];

 }];

所有的问题都是因为 .sqlite-wal 文件。在我的例子中,数据首先被插入到 wal(预写日志记录)文件中,然后该数据被提交到原始的 sqlite 文件中。 &当我试图复制那个原始的sqlite文件时我没有文件中的最新数据&我正在尝试复制该文件......所有数据(存在于原始文件中)都被正确复制。现在 wal 文件中的数据不在原始文件中,这就是为什么我在复制时无法获取该数据的原因。 &我在想数据丢失正在发生......经过如此多的努力我找到了解决方案。我使用以下代码行将 sqlite 日志模式更改为删除。

NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                        configuration:nil
                                        URL:storeURL
                                        options:options
                                        error:&error]