IndexedDB

IndexedDB — низкоуровневое API для клиентского хранилища большого объёма структурированных данных, включая файлы/blobs. Эти API используют индексы для обеспечения высоко-производительного поиска данных. Если DOM Storage  полезен для хранения небольшого количества данных, он менее выгоден для большого числа структурированных данных. IndexedDB предоставляет решение. Это основная страница на MDN, покрывающая IndexedDB — здесь мы предоставляем ссылки к полному списку API и руководствам по использованию, детали поддержки браузерами и некоторые объяснения ключевых концепций.

Примечание:

Эта возможность доступна в Web Workers.

Примечание: IndexedDB API мощные, но могут казаться слишком сложными для простых задач. Если вы предпочитаете простые API, попробуйте библиотеки, такие как localForage, dexie.js и ZangoDB, делающие IndexedDB более дружественным.

Ключевые концепции и  использование

IndexedDB транзакционная система базы данных, как SQL-основанная RDBMS. Однако, в отличие от RDBMS, которая использует таблицы с фиксированными колонками, IndexedDB — JavaScript-основанная объектно-ориентированная база данных. IndexedDB позволяет сохранять и возвращать объекты, которые были проиндексированы с ключом; любой объект, поддерживаемый структурированным алгоритмом клонирования может быть сохранён. Необходимо описать схему базы данных, установить соединение с ней и затем получить и обновить данные за несколько транзакций.

  • Читайте больше о Концепции IndexedDB.
  • Изучите асинхронное использование IndexedDB по первоначальным принципам с руководством Using IndexedDB.
  • Найдите рекомендации по разработке, чтобы заставить ваш сайт работать вне сети, на странице Offline Apps.

Примечание: Как и большинство решений web-хранения, IndexedDB следует аналогичной same-origin policy. Поэтому вы имеете доступ к хранилищу данных в пределах одного домена, но не можете получать их с любого другого.

Синхронность и асинхронность

Выполнение операций использующих IndexedDB происходит асинхронно, т. е. не блокирует приложение. IndexedDB первоначально включал синхронные и асинхронные API. Синхронные API предназначались только для работы с Web Workers, но были удалены из спецификации, потому что было неясно, нужны ли они. Однако, синхронные API могут быть повторно введены, если появится спрос со стороны веб разработчиков. 

Ограничения памяти и критерии освобождения 

Существует несколько веб-технологий, которые хранят данные того или иного вида на стороне клиента (т.е. на вашем локальном диске). Под IndexedDB чаще всего подразумевают одно. Процесс, в котором браузер вычисляет сколько места нужно выделить для хранения веб-данных. Ограничение памяти браузера и критерии освобождения пытаются объяснить как это работает, по крайней мере в случае с Firefox.

Интерфейсы

Чтобы получить доступ к базе данных, вызовите метод  open() y атрибута indexedDB  объекта window. Этот метод возвращает объект IDBRequest (en-US) ; асинхронные операции связываются с вызывающим приложением, вызывая события объекта IDBRequest (en-US) .

Подключение к базе данных

IDBEnvironment (en-US)
Предоставляет доступ к функциям IndexedDB. Реализовано объектами window и worker.
IDBFactory (en-US)
Предоставляет доступ к базе данных. Этот интерфейс представлен глобальным объектом indexedDB. Он является точкой входа для API.
IDBOpenDBRequest (en-US)
Представляет запрос на открытие базы данных.
IDBDatabase (en-US)
Представляет подключение к базе данных. Это единственный способ получить транзакцию в базе данных.

Получение и изменение данных

IDBTransaction (en-US)
Представляет транзакцию. Вы создаёте транзакцию в базе данных, указываете область действия (например, к каким хранилищам объектов вы хотите получить доступ) и определяете тип доступа (только чтение или чтение/запись), который вам нужен.
IDBRequest (en-US)
Generic interface that handles database requests and provides access to results.
IDBObjectStore (en-US)
Универсальный интерфейс, который обрабатывает запросы к базе данных и предоставляет доступ к результатам.
IDBIndex
Позволяет получить доступ к подмножеству данных в IndexedDB, но вместо первичного ключа использует индекс для извлечения записи (записей). Иногда это быстрее, чем использование IDBObjectStore (en-US).
IDBCursor (en-US)
Итерирует по хранилищам объектов и индексам.
IDBCursorWithValue (en-US)
Итерирует по хранилищам объектов и индексам и возвращает текущее значение курсора.
IDBKeyRange (en-US)
Определяет диапазон ключей, который можно использовать для извлечения данных из базы данных в определённом диапазоне.
IDBLocaleAwareKeyRange (en-US) Это API не было стандартизировано.
Определяет диапазон ключей, который можно использовать для извлечения данных из базы данных в определённом диапазоне, отсортированных в соответствии с правилами локали, указанной для определённого индекса (см. createIndex()'s optionalParameters.). Этот интерфейс не входит в спецификацию 2.0.

Пользовательские интерфейсы событий

Эта спецификация запускает события со следующим настраиваемым интерфейсом:

IDBVersionChangeEvent (en-US)
Интерфейс IDBVersionChangeEvent указывает, что версия базы данных изменилась в результате функции обработчика событий IDBOpenDBRequest.onupgradeneeded (en-US).

Устаревшие интерфейсы

Ранняя версия спецификации также определяла эти теперь удалённые интерфейсы. Они все ещё задокументированы на тот случай, если вам понадобится обновить ранее написанный код:

IDBVersionChangeRequest Этот API вышел из употребления и его работа больше не гарантируется.
Представляет запрос на изменение версии базы данных. С тех пор способ изменения версии базы данных изменился (путём вызова IDBFactory.open (en-US) без вызова IDBDatabase.setVersion), а интерфейс IDBOpenDBRequest (en-US) теперь имеет функциональность удалённого IDBVersionChangeRequest.
IDBDatabaseException (en-US)  Этот API вышел из употребления и его работа больше не гарантируется.
Представляет исключения, которые могут возникнуть при выполнении операций с базой данных.
IDBTransactionSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBTransaction (en-US).
IDBObjectStoreSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBObjectStore (en-US).
IDBIndexSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBIndex.
IDBFactorySync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBFactory (en-US).
IDBEnvironmentSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBEnvironment (en-US).
IDBDatabaseSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBDatabase (en-US).
IDBCursorSync (en-US) Этот API вышел из употребления и его работа больше не гарантируется.
Синхронная версия IDBCursor (en-US).

Примеры

  • eLibri: Мощная библиотека и приложение для чтения электронных книг, написанное Марко Кастеллуччо, победителем IndexedDB Mozilla DevDerby.
  • To-do Notifications (view example live): Эталонное приложение для примеров в справочной документации.
  • Storing images and files in IndexedDB

Спецификации

Спецификация Статус Комментарий
Indexed Database API 2.0 Рекомендация Initial definition
Indexed Database API 2.0 Рекомендация

Смотрите также

  • localForage: Polyfill, предоставляющий простое имя: синтаксис значения для клиентского хранилища данных, которое использует IndexedDB в фоновом режиме, но обращается к WebSQL, а затем к localStorage в браузерах, которые не поддерживают IndexedDB.
  • Dexie.js: Обёртка для IndexedDB, позволяющая значительно ускорить разработку кода благодаря красивому и простому синтаксису.
  • ZangoDB: Интерфейс, подобный MongoDB, для IndexedDB, который поддерживает большинство знакомых функций фильтрации, проекции, сортировки, обновления и агрегирования MongoDB.
  • JsStore: Оболочка IndexedDB с синтаксисом, подобным SQL.
  • MiniMongo: Клиентский MongoDB, поддерживаемый localStorage, с синхронизацией сервера по http. MiniMongo используется в MeteorJS.
  • PouchDB: Клиентская реализация CouchDB в браузере с использованием IndexedDB
  • idb: Крошечная (~1,15 КБ) библиотека, которая в основном представляет API IndexedDB, но с небольшими улучшениями, которые имеют большое значение для удобства использования.
  • idb-keyval: Суперпростое-маленькое (~600 Б) хранилище ключей на основе Promise, реализованное с помощью IndexedDB
  • sifrr-storage: Небольшая (~2 КБ) библиотека на основе Promise для хранения ключей и значений на стороне клиента. Работает с IndexedDB, localStorage, WebSQL, Cookies. Может автоматически использовать поддерживаемое хранилище, доступное в зависимости от приоритета.
  • lovefield: Lovefield - это реляционная база данных для веб-приложений. Написана на JavaScript, работает кроссбраузерно. Предоставляет API-интерфейсы, подобные SQL, быстрые, безопасные и простые в использовании.