Executando Consultas com IndexedDB API - JavaScript
No IndexedDB, todas as operações de banco de dados são encapsuladas em transações, representadas pelo tipo IDBTransaction
transaction()
O método transaction()
transaction(storeNames)
transaction(storeNames, mode)
O método transaction()
: Um array contendo os nomes dos armazenamentos (object stores) que serão acessados na transação.storeNames
(opcional): Define o tipo de acesso permitido na transação. Pode ter os seguintes valores:mode
: Permite apenas leitura dos dados. É o padrão, caso o parâmetro não seja especificado.readonly
: Permite leitura e escrita nos dados.readwrite
: Permite operações avançadas, como criação e exclusão de armazenamentos e índices.versionchange
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:
: Instância do banco de dados (IDBDatabase).db
: Detalhes sobre erros ocorridos na transação, representados como um objeto DOMException.error
: O modo de acesso da transação (por padrão,mode
).readonly
: Lista de armazenamentos incluídos na transação, representada como um objetoobjectStoreNames
.DOMStringList
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
objectStore()
const userStore = transaction.objectStore("users"); // Acessa o armazenamento "users"
É importante ressaltar que o armazenamento deve ter sido previamente criado utilizando o método createObjectStore()
IDBDatabase
Os armazenamentos geralmente são gerenciando durante o evento onupgradeneeded
"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
: Adiciona novos registros ao armazenamento.add()
: Remove todos os registros do armazenamento.clear()
: Retorna o número total de registros no armazenamento.count()
: Cria um novo índice para consulta.createIndex()
: Remove um registro com base em sua chave.delete()
: Remove um índice do armazenamento.deleteIndex()
: Retorna um registro baseado em uma chave específica.get()
: Retorna apenas a chave de um registro.getKey()
: Retorna todos os registros do armazenamento.getAll()
: Retorna todas as chaves dos registros.getAllKeys()
: Acessa um índice para realizar consultas específicas.index()
: Permite iterar pelos registros com o uso de um cursor.openCursor()
: Itera apenas pelas chaves dos registros.openKeyCursor()
: Atualiza registros existentes ou adiciona novos.put()
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);
};