如何 VACUUM 一个 Core Data SQLite 数据库?

Posted

技术标签:

【中文标题】如何 VACUUM 一个 Core Data SQLite 数据库?【英文标题】:How to VACUUM a Core Data SQLite db? 【发布时间】:2009-10-07 14:57:12 【问题描述】:

按照设计,Core Data 不会像detailed here 那样向其 SQLite 数据库发出 VACUUM SQL 命令。我正在创建一个核心数据应用程序,它将在 SQLite 数据库中存储并稍后删除大型二进制文件(大小为 2-10MB)。随着时间的推移,这将导致碎片化和超出必要的 SQLite 数据库。我想定期发出一个 VACUUM 命令,比如说,在我运行的清理操作期间。

如何以编程方式向 Core Data 的 SQLite 存储发出 VACUUM 命令? 是否可以通过 Core Data 执行此操作,或者我必须挂载 SQLite db 并直接连接到它以执行 VACUUM SQL?

【问题讨论】:

【参考方案1】:

在 OS X 10.6 / ios 3.0 及更高版本上,支持的方法是在将存储添加到持久存储协调器时在选项中设置 NSSQLiteManualVacuumOption。

【讨论】:

【参考方案2】:

是的,vacuum 是 SQLite 中公认的 SQL 语句。可以作为普通查询使用,or so it says。

但请注意,因为它可能导致过多的文件系统读取和写入——几乎是任何系统的瓶颈——更不用说 Windows 服务器上的服务器文件系统碎片了。

【讨论】:

问题是如何通过Core Data执行,而不是它是否存在。【参考方案3】:

这里是你如何vacuum你的CoreData容器

例子:

let container = NSPersistentContainer(name: "someName")

// Enable history tracking and remote notifications
guard let description = container.persistentStoreDescriptions.first else 
    fatalError("###\(#function): Failed to retrieve a persistent store description.")


description.setOption(true as NSNumber, forKey: NSSQLiteManualVacuumOption)

//... The rest of your setup

通过这样做,CoreData 容器将执行vacuum 命令并相应地调整自身大小。

【讨论】:

以上是关于如何 VACUUM 一个 Core Data SQLite 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3 Vacuum,如何在cordova APP上使用

如何从使用 pg_cron 运行的清除例程中链接 VACUUM?

来自 SQLiteOpenHelper 的 VACUUM sqlite 数据库

Core-Data:如何在一个关系中保存一个对象两次

SQLite Vacuum

如何使用 core-data 存储一个值? (迅速 2)