O que é o IndexedDB?
O IndexedDB é um padrão da Web em evolução para o armazenamento de quantidades significativas de dados estruturados no navegador e para pesquisas de alto desempenho nesses dados usando índices. Em outras palavras, o IndexedDB é um armazenamento de objetos. Não é o mesmo que um banco de dados relacional, que tem tabelas com linhas e colunas de coleções. Essa é uma diferença importante e fundamental que afeta a maneira como você projeta e cria seus aplicativos (mais sobre os conceitos básicos).
Então, o que há de novo?
Mudanças, amigos... Temos algumas mudanças que vão gerar alguns erros se não as resolvermos com uma simples mudança de sintaxe.
Da versão 17 em diante, o Chrome vai gerar um erro se uma transação IndexedDB não estiver no escopo de um armazenamento de objetos. Como toda a leitura e gravação de dados são feitas dentro de transações, precisamos criar uma transação em um banco de dados, especificar o escopo (como quais armazenamentos de objetos você quer acessar) e determinar o tipo de acesso (somente leitura ou gravação).
O que isso significa no código? Bem, em vez de passar uma matriz vazia para nosso database.transaction:
var transaction = db.transaction([], IDBTransaction.READ_ONLY);
É preciso ter o escopo para um armazenamento de objetos específico ou para uma lista de armazenamentos de objetos:
// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);
// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
IDBTransaction.READ_ONLY);
// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);
É possível acelerar o acesso aos dados usando o escopo e o modo corretos na transação. Aqui estão algumas dicas:
ao definir o escopo, especifique apenas os armazenamentos de objetos de que você precisa. Dessa forma, é possível executar várias transações com escopos não sobrepostos ao mesmo tempo.
Especifique um modo de transação READ_WRITE
somente quando necessário. É possível executar simultaneamente várias transações READ_ONLY
com escopos sobrepostos, mas você pode ter apenas uma transação READ_WRITE
para um repositório de objetos.
Outras fontes:
- A atualização em chromium.org
- Mais detalhes sobre IndexedDB no MDN
- Um exemplo completo de como usar o IndexingDB em um app da Web simples de lista de tarefas
Até a próxima... continue levando a Web para territórios próximos.