Executarea interogărilor în baza de date
Toate operațiunile cu baza de date IndexDB sunt încapsulate în tranzacții, care reprezintă tipul IDBTransaction. Pentru a crea obiecte de acest tip, la obiectul bazei de date IDBDatabase se apelează metoda transaction():
transaction(storeNames)
transaction(storeNames, mode)
Această metodă acceptă următoarele parametri:
- storeNames: un array de nume ale magazinelor de obiecte, la care se accesează în tranzacție.
const request = indexedDB.open("test", 3); // ne conectăm la bd test
request.onsuccess = (event) => {
const db = event.target.result; // obținem bd
// creăm tranzacție
const transaction = db.transaction("users"); // accesăm magazinul "users"
console.log(transaction);
};
Dacă trebuie să implicăm mai multe magazine, atunci sunt definite într-un array:
const transaction = db.transaction(["users", "companies"]); // accesăm magazinele "users" și "companies"
Dacă trebuie să specificăm toate magazinele de obiecte ale bazei de date, atunci se poate folosi proprietatea IDBDatabase.objectStoreNames:
const transaction = db.transaction(db.objectStoreNames);
Mode: un parametru opțional, stabilește tipul de acces la baza de date. Poate lua următoarele valori:
- readonly: datele sunt accesibile doar pentru citire. Această valoare este utilizată implicit, dacă parametrul mode nu este specificat explicit
- readwrite: datele sunt accesibile atât pentru citire, cât și pentru scriere
- versionchange: sunt permise citirea și scrierea, precum și operațiunile de ștergere sau creare a magazinelor și indexurilor de obiecte
Exemplu de utilizare:
const transaction = db.transaction("users", "readwrite");
Cu ajutorul proprietăților IDBTransaction se poate obține anumite informații despre tranzacție:
- db: obiectul bazei de date (IDBDatabase)
- error: informații despre eroare sub forma unui obiect DOMException
- mode: modul de acces la baza de date, dacă nu este setat, atunci implicit readonly
- objectStoreNames: lista magazinelor implicate în tranzacție (obiect DOMStringList), unde fiecare magazin reprezintă un obiect IDBObjectStore
De exemplu, obținerea datelor:
const request = indexedDB.open("test", 3); // ne conectăm la bd test
request.onsuccess = (event) => {
const db = event.target.result; // obținem bd
// creăm tranzacție
const transaction = db.transaction(["users"], "readwrite");
console.log(transaction.db.name); // test
console.log(transaction.mode); // readwrite
console.log(transaction.objectStoreNames); // DOMStringList {0: "users", length: 1}
};
Obținerea magazinului
Pentru a efectua operațiuni propriu-zise cu magazinul în cadrul tranzacției se utilizează diferite metode ale obiectului IDBObjectStore, care de fapt reprezintă magazinul. Pentru a obține obiectul IDBObjectStore la obiectul tranzacției IDBTransaction se apelează metoda objectStore():
const userStore = transaction.objectStore("users"); // obținem magazinul users
Trebuie menționat că magazinul trebuie să fie creat anterior cu ajutorul metodei createObjectStore() a obiectului IDBDatabase. Crearea unui magazin se poate face la crearea sau modificarea versiunii bazei de date:
const request = indexedDB.open("test", 5); // ne conectăm la bd test
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (db.objectStoreNames.contains("users")) {
db.deleteObjectStore("users");
}
const userStore = db.createObjectStore("users", { keyPath: "id", autoIncrement: true });
console.log(userStore);
};
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction(["users"], "readwrite");
const userStore = transaction.objectStore("users");
console.log(userStore);
};
Tipul IDBObjectStore oferă următoarea serie de metode pentru operații asupra datelor din magazin:
- add - adaugă noi obiecte în magazin
- clear - curăță magazinul șterge toate obiectele
- count - returnează numărul total de obiecte
- createIndex - creează un nou index
- delete - șterge din magazin obiectul cu cheia specificată
- deleteIndex - șterge indexul specificat
- get - returnează obiectul cu cheia specificată
- getKey - returnează cheia obiectului
- getAll - returnează toate obiectele din magazin
- getAllKeys - returnează cheile obiectelor
- index - returnează indexul magazinului
- openCursor - este folosit pentru a itera prin magazinul de obiecte pe baza cheii primare cu ajutorul unui cursor
- openKeyCursor - returnează un cursor pentru a itera prin magazinul de obiecte
- put - actualizează obiectele existente în magazin