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

Dha*_*ush 2 sqlite core-data vacuum ios

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

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

Jod*_*ins 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