【发布时间】:2019-02-15 09:15:12
【问题描述】:
我的应用程序使用带有 SQLite 存储的 Core Data 实现了 Web 缓存(有点像 NSURLCache,但可以更好地控制缓存的内容以及何时可以从缓存中清除)。当缓存变得太大时,我可以从缓存中清除旧数据,但这当然不会真正减少文件系统中使用的存储空间量。
我知道 NSPersistentStoreCoordinator 可以通过 NSSQLiteManualVacuumOption 选项在打开商店时执行 SQLite 真空,我认为这可能是减少文件大小的好方法(即使我必须暂时关闭并重新打开商店)。
但是,我通过 NSPersistentContainer 管理核心数据堆栈。有什么方法可以使用 NSPersistentContainer 进行 Apple 批准的 SQLite Vacuum?
或者我是否必须手动建立核心数据堆栈才能做到这一点?
否则在使用 NSPersistentConainer 时我应该如何回收 SQLite 存储空间?
更正:
关于空间没有被自动回收,我部分错了。即使没有设置NSSQLiteManualVacuumOption,磁盘空间也会被自动回收——有时。我不确定这是如何工作的。它不会立即发生,也不会在我每次保存上下文时发生,但是当它确实发生时,它会在从上下文中删除托管对象并保存上下文后非常快。
如果我执行一系列删除/保存命令,它们之间的存储空间不会被释放。但如果我稍后再次检查,空间已被回收(有时)。
也许 Core Data 默认使用 'auto_vacuum' SQLite pragma?虽然如果我记录 sqlite pragma,它只会打印一个空字典。
【问题讨论】:
标签: sqlite caching core-data vacuum