Gestionarea bazei de date în IndexedDB
Baza de date în IndexedDB API este reprezentată de interfața IDBDatabase, care asigură conexiunea cu baza de date, gestionarea magazinelor sale și crearea interogărilor către date. Parametrii bazei de date pot fi obținuți utilizând următoarele proprietăți IDBDatabase:
- name: returnează numele bazei de date conectate
- version: returnează numărul versiunii bazei de date. La crearea bazei de date, acest atribut reprezintă un șir gol
- objectStoreNames: returnează lista de nume ale magazinelor (obiect DOMStringList), care există în prezent în baza de date conectată
De exemplu, obținem informații despre baza de date la conectare:
const request = indexedDB.open("test"); // ne conectăm la bd test
// la deschiderea reușită se activează evenimentul success
// procesăm acest eveniment
request.onsuccess = (event) => {
const database = event.target.result; // accesăm baza de date
console.log(database.name); // numele bazei de date - "Test"
console.log(database.version); // versiunea bazei de date
console.log(database.objectStoreNames); // lista magazinelor din baza de date
};
Pe lângă proprietăți, obiectul IDBDatabase oferă o serie de metode pentru gestionarea conexiunii și a magazinelor:
- close(): închide conexiunea cu baza de date
- createObjectStore(): creează un magazin
- deleteObjectStore(): șterge un magazin
- transaction(): returnează un obiect de tranzacție - obiect IDBTransaction, care este utilizat pentru accesarea magazinului și efectuarea ulterioară a unei interogări către date
Este de remarcat că crearea unui magazin este posibilă doar la crearea bazei de date sau la modificarea versiunii acesteia. Ștergerea unui magazin este posibilă doar la modificarea versiunii bazei de date.
Crearea unui magazin de obiecte
Astfel, pentru crearea unui magazin de obiecte se utilizează metoda createObjectStore():
createObjectStore(name)
createObjectStore(name, options)
În această metodă se transmite numele magazinului. Ca al doilea parametru opțional, se poate transmite și un obiect de configurare a magazinului. Acest obiect poate include două proprietăți:
- keyPath: specifică numele proprietății-cheie a obiectului
- autoIncrement: dacă are valoarea true, valorile cheilor sunt generate automat. Implicit, valoarea este false (cheile nu sunt generate)
Combinațiile acestor parametri sunt foarte importante. În IndexedDB, fiecare obiect este stocat sub o anumită cheie, care ulterior poate fi utilizată pentru accesul la obiect. Ce anume este utilizat ca cheie este determinat de diferite combinații ale parametrilor de configurare keyPath și autoIncrement:

De exemplu, creăm în baza de date test un magazin cu numele "users":
const request = indexedDB.open("test", 2); // ne conectăm la bd test
// procesăm crearea bazei de date sau modificarea versiunii
request.onupgradeneeded = (event) => {
const db = event.target.result; // obținem bd
// creăm magazinul de obiecte users
const objectStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
console.log(objectStore); // IDBObjectStore {name: "users", keyPath: "id", indexNames: DOMStringList, transaction: IDBTransaction, autoIncrement: true}
console.log(db.objectStoreNames); // lista magazinelor din baza de date
};
În acest caz, cheia obiectelor va fi proprietatea "id", iar valoarea sa va fi generată automat. Rezultatul metodei db.createObjectStore() este obiectul magazinului creat, care reprezintă tipul IDBObjectStore.
Este important de reținut că, dacă la deschiderea bazei de date se mărește numărul versiunii, magazinele din versiunile vechi se păstrează. Încercarea de a recrea un magazin de obiecte existent va rezulta într-o eroare.
Ștergerea unui magazin
Pentru ștergerea unui magazin se utilizează metoda deleteObjectStore(), în care se transmite numele magazinului care urmează să fie șters:
const request = indexedDB.open("test", 3); // ne conectăm la bd test
// procesăm modificarea versiunii bazei de date
request.onupgradeneeded = (event) => {
const db = event.target.result; // obținem bd
// recreăm magazinul users - mai întâi îl ștergem
db.deleteObjectStore("users");
// apoi îl creăm din nou
db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
console.log(db.objectStoreNames); // lista magazinelor din baza de date
};