Как 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.

Другие вопросы по тегам