【问题标题】:Reclaim space from Core Data SQLite store with NSPersistentContainer?使用 NSPersistentContainer 从 Core Data SQLite 存储中回收空间?
【发布时间】: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


    【解决方案1】:

    我认为它应该像这样工作;我自己从来没有做过:

    创建一个NSPersistentStoreDescription 并设置选项以包含NSSQLiteManualVacuumOption。在加载商店之前将此描述分配给NSPersistentContainerpersistentStoreDescriptions 属性。

    【讨论】:

    • 谢谢...我不知道为什么我自己看不到这个。另外值得注意的是,我对空间没有自动回收是错误的。即使不设置NSSQLiteManualVacuumOption ,也会自动回收磁盘空间。我不确定这是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多