在Core Data SQLite Persistent存储上使用Sqlite3 VACUUM命令

时间:2012-08-05 23:04:40

标签: ios core-data sqlite vacuum

在我们的应用程序中,我们正在通过网络/电子邮件实现部分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);
         }
        }

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

在您的情况下,听起来您希望在保存更改后但在通过电子邮件发送之前真空。使用NSSQLiteManualVacuumOption选项似乎只在最初打开SQLite文件时清空DB。

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

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