Gerenciando Objetos de Armazenamento com IndexedDB API - JavaScript
Introdução
O IndexedDB utiliza a interface IDBDatabase
IDBDatabase
: retorna o nome do banco de dados conectado.name
: retorna o número da versão do banco de dados. Ao criar um banco de dados, esse valor é inicialmente uma string vazia. A versão serve para controlar alterações na estrutura do banco.version
: retorna uma lista dos nomes dos armazenamentos existentes no banco conectado, representada por um objeto do tipoobjectStoreNames
.DOMStringList
A seguir, um exemplo de como obter essas informações:
const request = indexedDB.open("test"); // Conectando ao banco de dados "test"
// Evento acionado ao abrir o banco com sucesso
request.onsuccess = (event) => {
const database = event.target.result; // Acessa a conexão com o banco
console.log(database.name); // Nome do banco de dados: "test"
console.log(database.version); // Versão do banco de dados
console.log(database.objectStoreNames); // Lista de armazenamentos no banco
};
Além de suas propriedades, a interface IDBDatabase
: encerra a conexão com o banco de dados.close()
: cria um armazenamento.createObjectStore()
: remove um armazenamento.deleteObjectStore()
: retorna um objeto de transação (transaction()
), usado para acessar armazenamentos e realizar operações em dados.IDBTransaction
É importante ressaltar que a criação de armazenamentos só é permitida durante a criação inicial do banco de dados ou quando sua versão é alterada. Da mesma forma, a exclusão de armazenamentos só pode ser realizada durante uma mudança de versão.
Criando Armazenamentos de Objetos
O método createObjectStore()
createObjectStore(name)
createObjectStore(name, options)
O primeiro argumento é o nome do armazenamento. Opcionalmente, um objeto de configuração pode ser passado como segundo argumento. Este objeto aceita as seguintes propriedades:
: define o nome do atributo que será usado como chave para cada objeto.keyPath
: se definido comoautoIncrement
, valores para as chaves serão gerados automaticamente. O valor padrão étrue
, o que significa que os valores das chaves devem ser fornecidos explicitamente.false
A maneira como as chaves são gerenciadas depende da combinação de keyPath
autoIncrement
keyPath | autoIncrement | Descrição |
---|---|---|
Não especificado | false | O armazenamento aceita valores de qualquer tipo, incluindo tipos primitivos (números e strings). No entanto, a chave precisa ser fornecida explicitamente ao adicionar objetos. |
Especificado | false | O armazenamento aceita apenas objetos (não primitivos). Esses objetos precisam conter uma propriedade cujo nome corresponda ao valor de |
Não especificado | true | O armazenamento aceita valores de qualquer tipo. As chaves são geradas automaticamente, mas podem ser fornecidas manualmente, se necessário. |
Especificado | true | O armazenamento aceita apenas objetos. As chaves correspondem à propriedade especificada em |
A seguir, criamos um armazenamento chamado "users"
test
"id"
Neste exemplo, a chave para cada objeto será a propriedade "id"
db.createObjectStore()
IDBObjectStore
É importante destacar que se o número da versão do banco for incrementado ao abrir a conexão, os armazenamentos existentes são preservados. Tentativas de recriar um armazenamento já existente resultarão em erro.
Excluindo Armazenamentos
Para excluir um armazenamento, utiliza-se o método deleteObjectStore()
No exemplo a seguir, o armazenamento "users"
const request = indexedDB.open("test", 3); // Conecta ao banco de dados "test" na versão 3
request.onupgradeneeded = (event) => {
const db = event.target.result; // Obtém o banco de dados
// Remove o armazenamento "users"
db.deleteObjectStore("users");
// Cria novamente o armazenamento "users"
db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
console.log(db.objectStoreNames); // Lista de armazenamentos no banco
};
Nesse caso, o armazenamento antigo é excluído antes de ser recriado com novos parâmetros. Essa abordagem é útil para redefinir as configurações de um armazenamento já existente.