Como definir o escopo em transações IndexedDB

O que é o IndexedDB?

O IndexedDB é um padrão da Web em evolução para armazenamento de grandes quantidades de dados estruturados no navegador e para pesquisas de alto desempenho nesses dados usando índices. Em outras palavras, o IndexedDB é um repositório 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 forma como você projeta e cria seus aplicativos. Saiba mais sobre os conceitos básicos.

O que há de novo?

Mudanças, meus amigos... algumas mudanças vão gerar erros se não forem tratadas com uma mudança simples na sintaxe.

A partir da versão 17, o Chrome vai gerar um erro se uma transação do IndexedDB não estiver vinculada a um repositório de objetos. Como todas as leituras e gravações de dados são feitas em transações, precisamos criar uma transação em um banco de dados, especificar o escopo (por exemplo, quais lojas de objetos você quer acessar) e determinar o tipo de acesso (somente leitura ou gravação).

O que isso significa no código? Em vez de transmitir uma matriz vazia para a database.transaction:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

Você precisa definir o escopo para um objeto específico ou uma lista 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. Confira algumas dicas: Ao definir o escopo, especifique apenas as lojas de objetos necessárias. Dessa forma, é possível executar várias transações com escopos não sobrepostos simultaneamente. Especifique um modo de transação READ_WRITE apenas quando necessário. É possível executar várias transações READ_ONLY com escopos sobrepostos simultaneamente, mas você só pode ter uma transação READ_WRITE para um repositório de objetos.

Outras fontes:

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