在我们的应用程序中,我们正在通过网络/电子邮件实现部分Core Data SQLite数据库的共享。为了保持文件小,我已经实现了以下方法来缩小Core Data数据库。
- (void) shrinkDB
{
sqlite3 * database;
NSString * string = [shareStoreURL path];
const char * filename = [string cStringUsingEncoding:[NSString defaultCStringEncoding]];
char *errMsg;
if (sqlite3_open(filename, &database) == SQLITE_OK)
{
NSLog(@"Shrinking...");
if (sqlite3_exec(database, "VACUUM;", NULL, NULL, &errMsg) != SQLITE_OK)
{
NSLog(@"Failed execute VACUUM");
}
sqlite3_close(database);
}
}
问题:上面的代码确实收缩了数据库。但Apple表示Core Data的实施细节随时都可能发生变化。你认为在可预见的将来我会安全使用这种方法吗?或者还有其他更好的解决方案吗?
答案 0 :(得分:5)
执行此操作的正确方法是将NSSQLiteManualVacuumOption提供给持久性存储协调器。
文档摘录:
<强> NSSQLiteManualVacuumOption 强>
重建商店文件的选项键, 将商店添加到数据库时强制进行数据库范围的碎片整理 协调。这会调用SQLite的VACUUM命令。它被忽略了 SQLite商店以外的商店。适用于OS X v10.6及更高版本。 在NSPersistentStoreCoordinator.h中声明。
答案 1 :(得分:2)
Apple如何在SQLite数据库中构建持久数据是一个可能会发生变化的实现细节。但是,SQLite管理已删除记录的方法与Apple的实现无关。
话虽这么说,真空SQLite数据库的过程导致重建整个数据库,如果CoreData NSPersistentStoreCoordinator正在使用sqlite文件,这可能会产生负面影响。
在您的情况下,听起来您希望在保存更改后但在通过电子邮件发送之前真空。使用NSSQLiteManualVacuumOption选项似乎只在最初打开SQLite文件时清空DB。
我要么在文件不再与NSPersistentStoreCoordinator关联后运行上面的代码,要么使用NSSQLiteManualVacuumOption然后重新打开并关闭文件,然后再通过电子邮件发送。
另一个选择是使用外部SQLite工具(例如Base on OS X)来手动清除文件。我过去也使用过Firefox SQLite管理器扩展程序。