【问题标题】:Using Sqlite3 VACUUM command on Core Data SQLite Persistent store在 Core Data SQLite 持久存储上使用 Sqlite3 VACUUM 命令
【发布时间】:2012-08-05 23:04:39
【问题描述】:

在我们的应用程序中,我们正在通过网络/电子邮件实现部分 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 的实施细节随时可能发生变化。你认为我在可预见的未来使用这种方法会安全吗?或者有没有其他更好的解决方案?

【问题讨论】:

标签: ios core-data sqlite vacuum


【解决方案1】:

执行此操作的正确方法是将 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

【讨论】:

  • 感谢乔迪!正如斯科特在下面所说,看起来我必须在通过电子邮件发送之前重新打开并关闭。
  • 如果使用核心数据接口,不一定。您可以使用多个持久存储协调器。然而,另一个可能会被锁定,直到真空完成。 FWIW,这怎么是一个拦截器?您真的认为在一个开放且正在运行的核心数据堆栈下运行纯 SQL 命令会更好吗?
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 谢谢斯科特!在运行代码之前,我正在从核心数据堆栈中删除持久存储。
猜你喜欢
  • 2012-12-14
  • 2014-05-28
  • 2019-01-30
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多