Описание тега indexeddb
Обзор
Стандарт indexedDB был создан для обеспечения масштабируемого, производительного хранения и извлечения объектов Javascript в браузере. При использовании indexedDB вы создаете хранилище объектов, которое по сути представляет собой именованный набор объектов, а затем можете помещать объекты в хранилище, а затем извлекать объекты из хранилища. В магазине можно хранить "большое" количество предметов. Вы также можете использовать индекс для ускорения поиска.
Предпосылки
Прежде чем приступить к работе с indexedDB, вам следует учесть несколько ключевых моментов:
Во-первых, API indexedDB значительно использует асинхронные функции. Перед использованием indexedDB вы должны быть знакомы с написанием асинхронного JavaScript. Значительное количество вопросов о stackru в теге indexedDB связано с неопытностью в работе с асинхронными функциями.
Во-вторых, indexedDB сериализует объекты при их сохранении. Когда вы сохраняете объект в базе данных, сам объект не сохраняется. Вместо этого сохраняется сериализованное представление объекта. Это сравнимо с использованиемJSON.stringify
вместе с JSON.parse
. Следовательно, когда вы извлекаете объект из магазина, вы получаете это сериализованное представление, а не исходный объект. У этой конструкции есть несколько ответвлений. Эта копия не является вашим реальным объектом. Это простой объект JavaScript со свойствами. Функции-члены отбрасываются вместе с информацией о типе объекта.
Основные понятия
- База данных: контейнер хранилищ объектов и индексов. У каждой базы данных есть название и версия.
- Хранилище объектов: контейнер объектов. Это аналог таблицы в реляционной базе данных. В indexedDB записи соответствуют объектам Javascript, а столбцы соответствуют свойствам объекта Javascript. Объекты, добавленные в магазин, хранятся в порядке добавления. Запросы к хранилищу извлекают объекты в том же порядке. Вы можете вставлять, обновлять или удалять объекты в хранилище объектов.
- Индекс: специальный контейнер для определенных объектов, содержащихся в хранилище объектов. Индексы также аналогичны таблицам и могут пониматься как хранилища объектов со специальными ограничениями. Когда объект вставляется в хранилище объектов, он может, если он соответствует определенным критериям, также быть вставлен в соответствующее хранилище индексов. Объекты в индексе хранятся в порядке, определенном индексом. Запросы к индексу извлекают объекты в порядке, определенном индексом (хотя запросы могут быть настроены для работы по-другому). Вы не можете вставлять, обновлять или удалять объекты в индексе (вы можете сделать это только косвенно, вставив объект в хранилище, на котором основан индекс).
- Курсор: курсоры аналогичны запросам. Курсор перебирает объекты в хранилище объектов или в индексе. Курсоры могут перемещаться вперед или назад, искать (переходить или продвигаться мимо объектов) и переходить к следующему или предыдущему "уникальному" объекту в базовом хранилище / индексе.
- Путь к ключу: пути к ключам аналогичны первичным ключам (или составным первичным ключам) таблицы в реляционной базе данных. В общем случае, когда вы инструктируете indexedDB создать хранилище объектов в конкретной базе данных, вы также определяете ключевой путь для хранилища. Вы можете использовать ключевой путь для быстрого получения определенного объекта, что аналогично использованию первичного ключа для выбора записи в реляционной таблице. При желании вы можете использовать ключи, чтобы гарантировать, что последующие попытки вставить объект в хранилище объектов, которое уже содержит объект с таким же ключом, приведут к ошибке.
- Транзакции и запросы: запросы аналогичны отдельным запросам SQL. Существуют определенные методы API для вставки объекта, удаления объекта, обновления объекта и перебора одного или нескольких объектов. Каждый вызов метода соответствует одному запросу. Каждый запрос происходит в контексте транзакции. Другими словами, в одной транзакции может быть несколько запросов. Отдельные запросы могут не выполняться по разным причинам. При выполнении нескольких запросов в одной транзакции запросы не фиксируются полностью, пока все запросы не будут признаны успешными. Таким образом, если проблема возникает в более позднем запросе, вся транзакция может быть "откатана", так что состояние базового хранилища объектов будет таким же, как и до появления первого запроса в транзакции.
Поддержка
Посетите http://caniuse.com/.
Учить больше
Пример на html5rocks.com. (Предупреждение: этот пример устарел, например, он использует
setVersion
вместо тогоonupgradeneeded
, и поэтому он может не работать в современных браузерах.)