我的应用程序使用带有SQLite存储的Core Data实现了Web缓存(有点类似于NSURLCache,但对缓存内容以及何时可以从缓存中清除内容有了更多控制)。当缓存过大时,我可以从缓存中清除旧数据,但是当然,这实际上并不会减少文件系统中使用的存储空间。
我知道可以通过NSSQLiteManualVacuumOption选项传递NSPersistentStoreCoordinator来在打开存储区时进行SQLite清除,而且我认为这可能是减小文件大小的好方法(即使我必须暂时关闭并重新开店)。
但是,我正在通过NSPersistentContainer管理核心数据堆栈。有什么方法可以使用NSPersistentContainer进行Apple认可的SQLite真空处理?
或者我必须手动建立Core Data堆栈吗?
否则,当使用NSPersistentConainer时,我还应该如何回收SQLite存储空间?
更正:
我对部分空间错误表示不自动回收空间。即使未设置NSSQLiteManualVacuumOption
,有时也会自动回收磁盘空间。我不确定这是如何工作的。它不会立即发生,也不会在每次保存上下文时都发生,但是一旦发生,在从上下文中删除托管对象并保存上下文之后,它很快。
如果我执行一系列删除/保存命令,则它们之间的存储空间不会释放。但是,如果不久之后我再次检查,该空间已被收回(有时)。
在默认情况下,核心数据是否正在使用'auto_vacuum'SQLite编译指示?尽管如果我登录sqlite实用程序,它只会打印一个空字典。
答案 0 :(得分:2)
我认为它应该像这样工作;我从来没有自己做过:
创建一个NSPersistentStoreDescription并设置选项以包含NSSQLiteManualVacuumOption
。在加载商店之前,将此说明分配给NSPersistentContainer
的{{3}}属性。