2

在我们的应用程序中,我们正在通过网络/电子邮件实现部分 Core Data SQLite 数据库的共享。为了保持文件较小,我实现了以下方法来缩小 Core Data 数据库。

    - (void) shrinkDB
    {
        sqlite3 * database;
        NSString * string = [shareStoreURL path];
        const char * filename = [string cStringUsingEncoding:[NSString defaultCStringEncoding]];
        char *errMsg;
        if (sqlite3_open(filename, &database) == SQLITE_OK)
        {
            NSLog(@"Shrinking...");
            if (sqlite3_exec(database, "VACUUM;", NULL, NULL, &errMsg) != SQLITE_OK)
            {
                NSLog(@"Failed execute VACUUM");
            }
            sqlite3_close(database);
         }
        }

问题:上面的代码确实缩小了数据库。但苹果表示,Core Data 的实施细节随时可能发生变化。你认为我在可预见的未来使用这种方法会安全吗?或者有没有其他更好的解决方案?

4

2 回答 2

5

执行此操作的正确方法是将 NSSQLiteManualVacuumOption 提供给持久存储协调器。

来自文档的片段:

NSSQLiteManualVacuumOption

重建存储文件的选项键,在将存储添加到协调器时强制进行数据库范围的碎片整理。这会调用 SQLite 的 VACUUM 命令。它被 SQLite 存储以外的存储忽略。在 OS X v10.6 及更高版本中可用。在 NSPersistentStoreCoordinator.h 中声明。

看到这个:https ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/NSPersistentStoreCoordinator.html

于 2012-08-05T23:50:06.560 回答
2

Apple 如何在 SQLite 数据库中构建持久数据是一个可能会发生变化的实现细节。但是,SQLite 管理已删除记录的方法与 Apple 的实现无关。

话虽如此,清理 SQLite 数据库的过程会导致重建整个数据库,如果 CoreData NSPersistentStoreCoordinator 正在使用 sqlite 文件,这可能会产生负面影响。

在您的情况下,听起来您想在保存更改之后但在通过电子邮件发送之前进行清理。使用 NSSQLiteManualVacuumOption 选项似乎仅在最初打开 SQLite 文件时清理数据库。

我要么在文件不再与 NSPersistentStoreCoordinator 关联后运行上述代码,要么使用 NSSQLiteManualVacuumOption 然后重新打开并关闭文件,然后再通过电子邮件发送。

另一种选择是使用外部 SQLite 工具(例如 OS X 上的 Base)来手动清理文件。我过去也使用过 Firefox SQLite 管理器扩展。

于 2012-08-06T00:11:23.077 回答