【问题标题】:Could not modify sqlite file after copying it to new path in ios将sqlite文件复制到ios中的新路径后无法修改它
【发布时间】:2015-10-26 10:54:53
【问题描述】:

在我的应用程序中,我有 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];

 }];

【问题讨论】:

  • 我观察到,如果我使用 sqliteManager 打开 sqlite,则 .sqlite-wal 和 .sqlite-shm 会被删除,然后只有所有数据会复制到 newUrl。 & 一旦文件被删除,旧数据库就不会被修改
  • 嗨!我必须向实体“XMPPMessageArchiving_Message_CoreDataObject”添加一个新属性,但为此我必须在 pod 中进行更改。是否可以在不更改属性的情况下添加新属性。

标签: ios database sqlite icloud xmppframework


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2014-08-16
    • 2022-10-17
    • 2019-06-10
    • 2021-11-27
    • 2022-01-08
    • 2018-03-11
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多