Метод clear() представляет собой одну из наиболее
радикальных операций над таблицей в IndexedDB-обёртке Dexie.js. Он
полностью удаляет все записи из указанного хранилища, сохраняя при этом
саму структуру таблицы, индексы и схему базы данных. В отличие от
последовательного удаления записей через delete() или
фильтрации через where().delete(), операция
clear() выполняется атомарно и значительно быстрее за счёт
особенностей внутреннего механизма IndexedDB.
table.clear()
Метод вызывается на экземпляре таблицы Dexie и возвращает
Promise, который резолвится после завершения операции
очистки.
await db.users.clear();
Также возможно использование в цепочке транзакций:
await db.transaction('rw', db.users, async () => {
await db.users.clear();
});
Операция clear() выполняет полное удаление всех записей
из таблицы без необходимости их предварительного чтения. Это
принципиально отличает её от обходных методов удаления.
Внутренне IndexedDB использует оптимизированную операцию очистки
object store, что делает выполнение clear() практически
мгновенным даже на больших объёмах данных.
Ключевые характеристики поведения:
Метод возвращает Promise<void>, что позволяет
использовать его в асинхронных цепочках:
db.logs.clear().then(() => {
console.log('Таблица очищена');
});
или с async/await:
await db.logs.clear();
Одним из ключевых преимуществ clear() является его
производительность. В отличие от итеративного удаления:
const all = await db.logs.toArray();
for (const item of all) {
await db.logs.delete(item.id);
}
операция clear() не выполняет:
IndexedDB реализует очистку как низкоуровневую операцию над object store, что делает её сложностью O(1) относительно количества записей.
Метод clear() может быть использован внутри транзакций
Dexie. Это особенно важно при комплексных операциях, где требуется
согласованность состояния нескольких таблиц.
await db.transaction('rw', db.users, db.logs, async () => {
await db.users.clear();
await db.logs.clear();
});
В этом случае очистка обеих таблиц либо завершится успешно, либо будет откатана целиком при возникновении ошибки.
При использовании clear() в транзакции важно учитывать
следующие особенности:
rw);TransactionInactiveError;После выполнения clear() все индексы остаются в рабочем
состоянии. Это связано с тем, что IndexedDB не пересоздаёт структуру
object store, а лишь удаляет все ключи и связанные значения.
Важно:
Основные ошибки, которые могут возникнуть при использовании
clear():
TransactionInactiveError
Возникает при попытке выполнения операции вне активной транзакции или в завершённой транзакции.
ReadOnlyError
Появляется, если таблица не открыта в режиме записи.
await db.transaction('r', db.users, async () => {
await db.users.clear(); // ошибка
});
ConstraintError (косвенно)
Может возникать в редких случаях при наличии зависимых транзакций и блокировок.
Dexie поддерживает систему перехватчиков (hooks), таких как
creating, updating, deleting.
Однако clear() ведёт себя особым образом:
deleting для каждой записи;Это делает clear() более «грубым» инструментом,
обходящим детализированную бизнес-логику, завязанную на удаление
отдельных элементов.
Удаление через delete()
await db.users.delete(id);
Удаление через where().delete()
await db.users.where('active').equals(false).delete();
Полная очистка через clear()
await db.users.clear();
При работе с большими таблицами (десятки или сотни тысяч записей)
clear() демонстрирует стабильное время выполнения,
поскольку не зависит от количества элементов.
Особенности в таких сценариях:
При необходимости очистки всей базы данных применяется последовательный или транзакционный подход:
await db.transaction('rw', db.users, db.orders, db.logs, async () => {
await db.users.clear();
await db.orders.clear();
await db.logs.clear();
});
Такой подход обеспечивает атомарность операции, сохраняя согласованность данных между таблицами.
Если clear() выполняется внутри транзакции и происходит
ошибка после её вызова, IndexedDB откатывает всю транзакцию. Это
означает:
await db.transaction('rw', db.users, async () => {
await db.users.clear();
throw new Error('rollback');
});
В результате таблица users останется неизменной.
Операция clear() применяется в ситуациях, где требуется
полное сбрасывание состояния:
В приложениях с оффлайн-режимом clear() часто
используется как часть стратегии «full sync»:
Этот подход упрощает логику синхронизации, но требует осторожности при работе с конфликтующими локальными изменениями.
После выполнения clear() физический размер IndexedDB
может не уменьшиться мгновенно, поскольку браузеры часто не освобождают
пространство сразу. Однако логически таблица становится пустой, а новые
записи не сталкиваются с ограничениями старых данных.
Хотя спецификация IndexedDB стандартизирована, реализация очистки может иметь небольшие различия:
Dexie.js абстрагирует эти различия, предоставляя единый API.
Ручное удаление записей через итерацию:
await db.users.toCollection().modify(() => {});
await db.users.where(':id').above(0).delete();
или:
for (const user of await db.users.toArray()) {
await db.users.delete(user.id);
}
имеет существенные недостатки:
На этом фоне clear() остаётся наиболее эффективным
инструментом полной очистки таблицы.
После выполнения clear() таблица остаётся полностью
функциональной: