Как VACUUM базы данных SQLite БД?
Изначально Core Data не выдает команду VACUUM SQL для своих баз данных SQLite, как подробно описано здесь. Я создаю приложение Core Data, которое будет хранить, а затем удалять большие двоичные файлы (размером 2-10 МБ) в базе данных SQLite. Со временем это приведет к фрагментации и увеличению размера базы данных SQLite. Я хотел бы периодически вводить команду VACUUM, скажем, во время запуска операции очистки.
- Как можно программно выдать команду VACUUM для хранилищ SQLite Core Data?
- Можно ли сделать это через Core Data или я должен смонтировать базу данных SQLite и подключиться к ней напрямую, чтобы выполнить VACUUM SQL?
2 ответа
Поддерживаемый способ сделать это на OS X 10.6 / iOS 3.0 и более поздних версиях - установить NSSQLiteManualVacuumOption в параметрах при добавлении хранилища в постоянный координатор хранилища.
Вот как можно 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
является признанным оператором SQL в SQLite. Он может быть использован как обычный запрос, или так он говорит.
Однако будьте осторожны, так как это может привести к чрезмерному чтению и записи файловой системы - узкому месту практически любой системы - не говоря уже о фрагментации файловой системы сервера на серверах Windows.