Ios 在核心数据SQLite持久存储上使用Sqlite3真空命令

Ios 在核心数据SQLite持久存储上使用Sqlite3真空命令,ios,core-data,sqlite,vacuum,Ios,Core Data,Sqlite,Vacuum,在我们的应用程序中,我们通过网络/电子邮件实现了部分核心数据SQLite数据库的共享。为了保持文件大小较小,我实现了以下方法来收缩核心数据数据库 - (void) shrinkDB { sqlite3 * database; NSString * string = [shareStoreURL path]; const char * filename = [string cStringUsingEncoding:[NSString

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

    - (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);
         }
        }

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

正确的方法是将nssqlitemanualvacuum选项提供给持久存储协调器

文档中的片段:

NSSQLiteManualVacuumOption

用于重建存储文件的选项键, 将存储添加到数据库时强制数据库范围的碎片整理 协调员这将调用SQLite的VACUUM命令。它被忽视了 SQLite存储区以外的存储区。在OS X v10.6及更高版本中提供。 在nspersistentstorecordinator.h中声明


请参阅:

苹果如何在SQLite数据库中构造持久数据是一个可能会更改的实现细节。然而,SQLite管理删除记录的方法独立于苹果的实现

也就是说,清空SQLite数据库的过程会导致重建整个数据库,如果CoreData NSPersistentStoreCoordinator正在使用SQLite文件,这可能会产生负面影响

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

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


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

谢谢Jody!正如Scott在下面所说,看起来我必须在通过电子邮件发送之前重新打开和关闭。如果你使用核心数据接口,不一定。您可以使用多个持久存储协调员。然而,另一个可能会被锁定,直到真空完成。FWIW,那怎么会是拦截器?您真的认为在一个开放且运行的核心数据堆栈下运行纯SQL命令会更好吗?谢谢Scott!在运行代码之前,我正在从核心数据堆栈中删除持久存储。可能存在重复的