Удаление базы данных средствами IndexedDB API

Удаление базы данных в 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() подходит, если необходимо сохранить структуру базы данных и индексы, но удалить данные.


Особенности работы метода deleteDatabase

  1. Асинхронность Метод не блокирует основной поток выполнения. Все действия выполняются через события или промисы при обёртке в async/await.

  2. Безопасность доступа Удаление базы данных может быть заблокировано, если она открыта в другом окне, вкладке или активной транзакции.

  3. Совместимость с браузерами Метод поддерживается всеми современными браузерами, но важно учитывать старые версии, где обработка 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 для упрощения логики и улучшения читаемости кода.

Удаление базы данных — окончательная операция, поэтому важно убедиться, что данные больше не нужны, или предварительно создать резервные копии, если существует вероятность повторного использования информации.