Удаление базы данных в IndexedDB осуществляется с
помощью метода indexedDB.deleteDatabase(). Этот метод
позволяет полностью удалить выбранную базу данных вместе со всеми её
хранилищами (object stores) и индексами. Он принимает один обязательный
параметр — имя базы данных, и возвращает объект
IDBOpenDBRequest, на котором можно отслеживать успешное
завершение операции или ошибки.
const request = indexedDB.deleteDatabase('myDatabase');
После вызова deleteDatabase браузер инициирует процесс
удаления, который может быть асинхронным. Результат операции
контролируется с помощью событий onsuccess,
onerror и onblocked.
1. onsuccess Срабатывает, когда база данных успешно удалена. Используется для выполнения действий после очистки всех данных.
request.onsucc ess = function(event) {
console.log('База данных успешно удалена');
};
2. onerror Срабатывает при возникновении ошибки в процессе удаления, например, если база данных не существует или доступ к ней заблокирован.
request.oner ror = function(event) {
console.error('Ошибка при удалении базы данных:', event.target.error);
};
3. onblocked Возникает, если база данных не может быть удалена сразу, так как открыта в другом окне или вкладке. Это важный момент, на который необходимо обращать внимание при разработке многовкладочных приложений.
request.onbloc ked = function(event) {
console.warn('Удаление базы данных заблокировано. Закройте другие вкладки с этой базой данных.');
};
Удаление базы данных отличается от удаления всех записей из конкретного object store. В первом случае база данных полностью исчезает из IndexedDB, включая все хранилища и индексы. Во втором случае удаляются только данные, а структура базы данных остаётся нетронутой.
Пример очистки хранилища:
const openRequest = indexedDB.open('myDatabase');
openRequest.onsucc ess = function(event) {
const db = event.target.result;
const transaction = db.transaction('users', 'readwrite');
const store = transaction.objectStore('users');
const clearRequest = store.clear();
clearRequest.onsucc ess = function() {
console.log('Все записи в хранилище удалены');
};
};
Использование store.clear() подходит, если необходимо
сохранить структуру базы данных и индексы, но удалить данные.
Асинхронность Метод не блокирует основной поток
выполнения. Все действия выполняются через события или промисы при
обёртке в async/await.
Безопасность доступа Удаление базы данных может быть заблокировано, если она открыта в другом окне, вкладке или активной транзакции.
Совместимость с браузерами Метод поддерживается
всеми современными браузерами, но важно учитывать старые версии, где
обработка onblocked может отсутствовать.
Для удобства работы с асинхронными операциями можно обернуть
deleteDatabase в промис:
function deleteDatabaseAsync(dbName) {
return new Promise((resolve, reject) => {
const request = indexedDB.deleteDatabase(dbName);
request.onsucc ess = () => resolve();
request.oner ror = (event) => reject(event.target.error);
request.onbloc ked = () => console.warn('Удаление заблокировано');
});
}
// Использование
deleteDatabaseAsync('myDatabase')
.then(() => console.log('База данных удалена'))
.catch(err => console.error('Ошибка удаления:', err));
Такой подход позволяет интегрировать удаление базы данных в современные асинхронные потоки кода без использования событийной модели напрямую.
onblocked.async/await для упрощения
логики и улучшения читаемости кода.Удаление базы данных — окончательная операция, поэтому важно убедиться, что данные больше не нужны, или предварительно создать резервные копии, если существует вероятность повторного использования информации.