如何 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?