Executando Consultas com o IndexedDB em JavaScript
No IndexedDB, todas as operações de banco de dados são encapsuladas em transações, representadas pelo tipo IDBTransaction
. Essas transações permitem manipular os dados de forma organizada e segura. Para criar uma transação, utiliza-se o método transaction()
do objeto IDBDatabase.
O método transaction()
possui a seguinte assinatura:
transaction(storeNames);
transaction(storeNames, mode);
O método transaction()
pode receber seguintes parâmetros:
storeNames
: Um array contendo os nomes dos armazenamentos (object stores) que serão acessados na transação.mode
(opcional): Define o tipo de acesso permitido na transação. Pode ter os seguintes valores:readonly
: Permite apenas leitura dos dados. É o padrão, caso o parâmetro não seja especificado.readwrite
: Permite leitura e escrita nos dados.versionchange
: Permite operações avançadas, como criação e exclusão de armazenamentos e índices.
Abaixo, um exemplo básico de criação de uma transação:
const request = indexedDB.open("test", 3); // Conecta ao banco de dados 'test'
request.onsuccess = (event) => {
const db = event.target.result; // Obtém a instância do banco de dados
const transaction = db.transaction("users"); // Cria uma transação para o armazenamento "users"
console.log(transaction);
};
Para acessar múltiplos armazenamentos em uma única transação, basta listá-los como um array:
const transaction = db.transaction(["users", "companies"]); // Acessa "users" e "companies"
Caso seja necessário incluir todos os armazenamentos do banco, pode-se utilizar a propriedade objectStoreNames
:
const transaction = db.transaction(db.objectStoreNames);
Propriedades do Objeto IDBTransaction
A interface IDBTransaction oferece propriedades úteis para obter informações sobre a transação:
db
: Instância do banco de dados (IDBDatabase).error
: Detalhes sobre erros ocorridos na transação, representados como um objeto DOMException.mode
: O modo de acesso da transação (por padrão,readonly
).objectStoreNames
: Lista de armazenamentos incluídos na transação, representada como um objetoDOMStringList
.
Exemplo de uso das propriedades:
const request = indexedDB.open("test", 3);
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction(["users"], "readwrite");
console.log(transaction.db.name); // Nome do banco: 'test'
console.log(transaction.mode); // Modo: 'readwrite'
console.log(transaction.objectStoreNames); // Armazenamentos: ["users"]
};
Acessando um Armazenamento (objectStore)
Dentro de uma transação, o acesso aos dados é realizado através de um objeto de armazenamento, representado pelo objeto IDBObjectStore
. Para obtê-lo, utiliza-se o método objectStore()
da transação:
const userStore = transaction.objectStore("users"); // Acessa o armazenamento "users"
É importante ressaltar que o armazenamento deve ter sido previamente criado utilizando o método createObjectStore()
do objeto IDBDatabase
.
Os armazenamentos geralmente são gerenciando durante o evento onupgradeneeded
, que é disparado ao criar ou alterar a versão de um banco de dados. O exemplo abaixo ilustra a criação de um armazenamento chamado "users"
:
const request = indexedDB.open("test", 5); // Conecta ao banco de dados 'test'
// Evento para criação ou atualização da estrutura do banco
request.onupgradeneeded = (event) => {
const db = event.target.result;
// Remove o armazenamento "users", se já existir
if (db.objectStoreNames.contains("users")) {
db.deleteObjectStore("users");
}
// Cria um novo armazenamento com chave primária "id" e auto-incremento
const userStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
console.log(userStore);
};
// Evento para manipulação de dados após abertura do banco
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction(["users"], "readwrite");
const userStore = transaction.objectStore("users");
console.log(userStore);
};
Métodos Disponíveis no IDBObjectStore
O objeto IDBObjectStore
oferece diversos métodos para gerenciar os dados no armazenamento:
add()
: Adiciona novos registros ao armazenamento.clear()
: Remove todos os registros do armazenamento.count()
: Retorna o número total de registros no armazenamento.createIndex()
: Cria um novo índice para consulta.delete()
: Remove um registro com base em sua chave.deleteIndex()
: Remove um índice do armazenamento.get()
: Retorna um registro baseado em uma chave específica.getKey()
: Retorna apenas a chave de um registro.getAll()
: Retorna todos os registros do armazenamento.getAllKeys()
: Retorna todas as chaves dos registros.index()
: Acessa um índice para realizar consultas específicas.openCursor()
: Permite iterar pelos registros com o uso de um cursor.openKeyCursor()
: Itera apenas pelas chaves dos registros.put()
: Atualiza registros existentes ou adiciona novos.
A seguir, um exemplo de adição de um novo registro ao armazenamento "users"
:
const transaction = db.transaction(["users"], "readwrite");
const userStore = transaction.objectStore("users");
const newUser = { name: "John Doe", age: 30 };
const request = userStore.add(newUser);
request.onsuccess = () => {
console.log("Registro adicionado com sucesso!");
};
Para recuperar todos os registros do armazenamento, utiliza-se o método getAll()
:
const transaction = db.transaction(["users"], "readonly");
const userStore = transaction.objectStore("users");
const request = userStore.getAll();
request.onsuccess = (event) => {
console.log("Dados:", event.target.result);
};
Documentação oficial: