Управление базой данных в IndexedDB

Последнее обновление: 11.11.2023

База данных в IndexedDB API представлена интерфейсом IDBDatabase, который обеспечивает соединение с базой данных, управление ее хранилищами и создание запросов к данным. Параметры базы данных можно получить с помощью следующих свойств IDBDatabase:

  • name: возвращает имя подключенной базы данных

  • version: возвращает номер версии базы данных. При создании базы данных этот атрибут представляет собой пустую строку.

  • objectStoreNames: возвращает список имен хранилищ (объект DOMStringList), которые в данный момент имеются в подключенной базе данных

Например, получим информацию о базе данных при подключении:

const request = indexedDB.open("test"); // подключаемся к бд test
// при удачном открытии срабатывает событие success
// обрабатываем это событие
request.onsuccess = (event) => {  
    const database = event.target.result;  // обращаемся к базе данных  
    console.log(database.name);            // имя базы данных - "Test"  
    console.log(database.version);            // версия базы данных 
    console.log(database.objectStoreNames); // список хранилищ в базе данных
};

Кроме свойств объект IDBDatabase предоставляет ряд методов для управления подключением и хранилищами:

  • close(): закрывает подключение к базе данных

  • createObjectStore(): создает хранилище

  • deleteObjectStore(): удаляет хранилище

  • transaction(): возвращает объект транзакции - объект IDBTransaction, который применяется для получения хранилища и последующего выполнения запроса к данным

Стоит отметить, что создание хранилища возможно только при создании базы данных или при изменении ее версии. Удаление хранилища возможно только при изменении версии базы данных.

Создание хранилища объектов

Итак, для создания хранилища объектов применяется метод createObjectStore():

createObjectStore(name)
createObjectStore(name, options)

В этот метод передается имя хранилища. В качестве второго необязательного параметра также можно передать объект конфигурации хранилища. Этот объект может включать два свойства:

  • keyPath: задает название свойства-ключа объекта

  • autoIncrement: при значении true значения ключей генерируются автоматически. По умолчанию значение false (ключи не генерируются)

Комбинации этих параметров очень важны. В IndexedDB каждый объект хранится под определенным ключом, который впоследствии можно использовать для доступа к объекту. Что именно используется в качестве ключа, определяется различными комбинациями параметров конфигурации keyPath и autoIncrement:

keyPath

autoIncrement

Описание

Не указано

false

Хранилище объектов может хранить значения произвольного типа (в том числе значения примитивных типов как числа и строки). Однако ключ необходимо явно указывать каждый раз при добавлении нового объекта в базу данных

Указано

false

Хранилище объектов может хранить только объекты (т.е. никаких примитивных типов данных). Однако эти объекты должны иметь свойство с тем же именем, которое указанно в параметре keyPath

Не указано

true

Хранилище объектов может хранить значения произвольного типа (в том числе значения примитивных типов). Ключи объектов генерируются автоматически при добавлении объектов. Однако также можно явным образом указать ключ для объекта

Указано

true

Хранилище объектов может хранить только объекты (т.е. никаких примитивных типов данных). Ключи же называются также, как указано в параметре keyPath. Если у объекта это свойство отсутствует, то значение ключа генерируется автоматически и добавляется к новому объекту. Если же свойство уже существует в объекте, то ключ не генерируется, а в качестве ключа используется уже сохраненное значение

Например, создадим в базе данных test хранилище с именем "users":

const request = indexedDB.open("test", 2); // подключаемся к бд test

// обрабатываем создание базы данных или изменение версии
request.onupgradeneeded = (event) => { 
    const db = event.target.result;  // получаем бд
    // создаем хранилище объектов users
    const objectStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
    console.log(objectStore); // IDBObjectStore {name: "users", keyPath: "id", indexNames: DOMStringList, transaction: IDBTransaction, autoIncrement: true}
    console.log(db.objectStoreNames); // список хранилищ в базе данных
};

В данном случае ключом объектов будет служить свойство "id", причем его значение будет генерироваться автоматически. Результатом метода db.createObjectStore() является объект созданного хранилища, который представляет тип IDBObjectStore.

Следует учитывать, что, если при открытии базы данных увеличивается номер версии, хранилища старых версий сохранятся. При попытке повторно создать уже существующее хранилище объектов, будет выдана ошибка.

Удаление хранилища

Для удаления хранилища применяется метод deleteObjectStore(), в который передается имя удаляемого хранилища:

const request = indexedDB.open("test", 3); // подключаемся к бд test

// обрабатываем изменение версии базы данных
request.onupgradeneeded = (event) => { 
    const db = event.target.result;  // получаем бд
    // пересоздаем хранилище users - сначала удаляем
    db.deleteObjectStore("users");  
    // потом заново создаем
    db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
    console.log(db.objectStoreNames); // список хранилищ в базе данных
};
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850