Como definir o escopo em transações IndexedDB

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:

Até a próxima... continue levando a Web para territórios próximos.