Lucrul cu IndexedDB - Partea 2

Bine ați venit la partea a doua a articolului IndexedDB. eu tare recomandăm citirea primului articol din această serie, deoarece voi presupune că sunteți familiarizat cu toate conceptele acoperite până acum. În acest articol, vom încheia aspectele CRUD pe care nu le-am finalizat înainte (în special actualizarea și ștergerea conținutului) și apoi demonstram o aplicație reală pe care o vom folosi pentru a demonstra alte concepte în articolul final.


Actualizarea înregistrărilor

Să începem prin discutarea modului de actualizare a unei înregistrări cu IndexedDB. Dacă vă aduceți aminte, adăugarea datelor a fost destul de simplă:

// Definirea unei persoane var person = nume: nume, email: email, creat: new Date () // Efectuați add var request = store.add (person);

Actualizarea unei înregistrări este la fel de simplă. Presupunând că ați definit o proprietate numită id ca cheia pentru magazinul dvs. de obiecte, puteți pur și simplu utiliza a pune în loc de adăuga.

var person = nume: nume, email: email, creat: new Date (), id: someId // Efectuați actualizarea var request = store.put (person);

Ca adăuga , puteți să atribuiți metode pentru a gestiona rezultatele asincrone ale operației.


Ștergerea înregistrărilor

Ștergerea înregistrărilor se face prin metoda de ștergere. (O surpriză mare acolo.) Trebuie doar să treci în identificatorul unic al înregistrării pe care vrei să o elimini. Iată un exemplu simplu:

 var t = db.transaction (["oameni", "readwrite"); var request = t.objectStore ("oameni") șterge (thisId);

Și ca orice alt aspect al IndexedDB, puteți adăuga mânerele pentru rezultatele asincrone.

Deci, așa cum am spus, nu este foarte interesant, ceea ce este probabil bun. Vrei ca API-urile tale să fie simple, plictisitoare și surprinzătoare. Acum să luăm ceea ce am învățat și să-i aducem împreună pentru a crea o aplicație reală, dacă este simplă.


Aplicația Notă

Ok, în sfârșit, avem toate (bine, majoritatea) părțile de care avem nevoie pentru a construi o aplicație reală. Deoarece nu a fost făcută înainte (hm), vom construi o notă simplă luând aplicația. Să ne uităm la câteva fotografii și apoi vă voi arăta codul din spatele ei. La lansare, aplicația inițializează un indexedDB pentru aplicație și redă o tabelă goală. Inițial, tot ce puteți face cu aplicația este să adăugați o notă nouă. (Am putea face acest lucru un pic cam mai ușor de utilizat, probabil.)


Dând clic pe Adauga notita butonul deschide un formular:


După introducerea unor date în formular, puteți salva nota:


După cum puteți vedea, aveți opțiunea de a edita și șterge note. În cele din urmă, dacă faceți clic pe rândul în sine, puteți citi nota:


Deci, nu exact știința rachetelor, ci un exemplu de lucru complet al specificației IndexedDB. Notele scrise aici vor persista. Puteți să închideți browserul, să reporniți aparatul, să vă opriți câțiva ani pentru a contempora viața și poezia și când deschideți din nou browserul, datele dvs. vor rămâne acolo. Să aruncăm o privire la codul acum.

În primul rând - o clauză de respingere a responsabilității. Această aplicație ar fi fost un candidat perfect pentru unul dintre multele cadre JavaScript. Sunt sigur că cei dintre voi care folosesc Backbone sau Angular vă pot imagina deja cum ați face acest lucru. Cu toate acestea - am luat decizia îndrăzneață aici nu utilizați un cadru. Am fost îngrijorat atât de oamenii care pot folosi un cadru diferit, cât și de cei care nu folosesc niciunul. Am vrut ca accentul nostru să fie doar pe aspectele IndexedDB. Aștept pe deplin unii oameni să nu fie de acord cu această decizie, dar haideți-l în comentariu.

Primul nostru șablon este fișierul HTML. Avem doar una și cea mai mare parte este boilerplate Bootstrap:

     Notă Bază de date     
Notă Bază de date

Editați Notă

După cum sa menționat mai sus, o porțiune de dimensiune bună a acestui fișier este codul de șablon pentru Bootstrap. Partile de care ne intereseaza sunt noteList div, noteDetail div, și noteForm. Probabil că puteți presupune că acestea sunt DIV-urile pe care le vom actualiza, pe măsură ce utilizatorul face clic în aplicație.

Codarea fișierului nostru de bază pentru aplicații

Acum, să aruncăm o privire la app.js, fișierul de bază care gestionează logica pentru aplicația noastră.

/ * consolă globală, $, document, fereastră, alertă * / var db; funcția dtFormat (intrare) if (! input) return ""; var res = (input.getMonth () + 1) + "/" + input.getDate () + "/" + input.getFullYear () + ""; var ora = input.getHours (); var ampm = "AM"; dacă (ora === 12) ampm = "PM"; dacă (oră> 12) oră = 12; ampm = "PM";  var minut = input.getMinutes () + 1; dacă (minut < 10) minute = "0" + minute; res += hour + ":" + minute + " " + ampm; return res; 

Puteți ignora prima funcție deoarece este pur și simplu un utilitar de formatare pentru date. Să trecem mai departe la blocul pregătit pentru documentul jQuery.

Verificarea asistenței pentru browser

 $ (document) .ready (funcția () if (! ("indexedDB" în fereastră)) alert ("Suport indexedDB necesar pentru această demonstrație! ; var $ noteForm = $ ("# noteForm"); var openRequest = fereastra.indexedDB.open ("nettuts_notes_1", 1); openRequest.onerror = funcția (e) console.log .dir (e); openRequest.onupgradeneeded = funcția (e) var thisDb = e.target.result; var objectStore; // Creare notă OS dacă (! thisDb.objectStoreNames.contains ("note")) .log ("Trebuie să fac nota obiectelor"); objectStore = thisDb.createObjectStore ("notă", keyPath: "id", autoIncrement: true); = e.target.result; db.onerror = function (event) // Generator de erori pentru toate erorile direcționate către // requests alert ("eroare de bază de date:" + event.target.errorCode); (event.target);; displayNotes ();;

Prima noastră acțiune este să verificăm suportul pentru IndexedDB. Dacă browserul utilizatorului nu este compatibil, vom folosi o alertă și vom întrerupe funcția. Ar fi mai bine să le mutați pe o pagină care să explice pe deplin de ce nu pot folosi aplicația. (Și pentru a fi clar, am putea construi și o aplicație care a făcut uz de WebSQL ca o copie de siguranță. Dar din nou - accentul meu este aici pe simplitate.)

După ce am cachezat câțiva selectori de jQuery, pe care le vom folosi în întreaga aplicație, vom deschide baza noastră de date IndexedDB. Baza de date este destul de simplă. În onupgradeneeded handler puteți vedea un magazin de obiecte numit notițe fiind creat. După ce se termină totul, onsuccess handler va declanșa un apel către displayNotes.

displayNotes Funcţie

 funcția displayNotes () var transaction = db.transaction (["notă"], "readonly"); var content = ""(cursor) content ()) $ (" # noteList ") html (content); var handleResult = = ""; conținut + =""; conținut + =""; conținut + =""; cursor.continue (); altceva content + ="
TitluLa curent 
"+ Cursor.value.title +""+ DtFormat (cursor.value.updated) +"Editați Ștergeți
";; var objectStore = transaction.objectStore (" notă "); objectStore.openCursor () onsuccess = handleResult;

displayNotes funcția face ceea ce vă așteptați - obțineți toate datele și afișați-le. Am discutat cum să obținem toate rândurile de date în intrarea anterioară, dar vreau să subliniez ceva ușor diferit în legătură cu acest exemplu. Rețineți că avem un nou dispozitiv de gestionare a evenimentelor, onComplete, că ne-am legat de tranzacția însăși. Anterior, am folosit evenimente doar în cadrul acțiunilor, interior tranzacția, dar indexedDB ne permite să o facem și la nivelul superior. Acest lucru devine deosebit de util într-un caz ca acesta. Avem un șir uriaș, tabelul nostru HTML, pe care îl construim pe fiecare iterație a datelor noastre. Putem folosi tranzacția onComplete handler pentru a încheia porțiunea de afișare și a scrie-o folosind un apel simplu jQuery.

Șterge, Editați | ×, și Adăuga funcţii

 $ ("# noteList") pe ("click", "a.delete", funcția (e) var thisId = $ (this) .parent () = db.transaction (["notă"], "readwrite"); var request = t.objectStore ("notă") delete (thisId); (); $ noteForm.hide ();; return false;); $ ("# noteList") pe ("click", "a.edit", funcția (e) var thisId = $ (this) = request_resistance = function (event) var note = request.result; $ ("# cheie" ) .val (note.id); $ ("# titlu"); val (note.title); $ ("# body"); ();; return false;); $ ("# noteList") pe ("click", "td", function () var thisId = $ (this) .parent () note = request.onsuccess = function (event) var note = request.result; $ noteDetail.html ("note");

"+ Note.title +"

"+ Note.body +"

") (" click "), funcția (e) $ (" # title ") val (" ); $ ("# body"); val (""); $ ("# cheie");

Următoarele două metode (șterge și Editați | ×) este un alt exemplu al aceluiași principiu. Deoarece niciunul dintre apelurile indexateDB nu este nou, nu ne vom deranja sa mergem peste ele. Cea mai mare parte a "cărnii" se termină prin manipularea DOM simplu pentru a face față acțiunilor particulare. Handlerul pentru a da clic pe butonul de adăugare este exact așa că vom trece și peste asta.

Salvați Funcţie

 $ ("# saveNoteButton") pe ("click", funcția () var title = $ ("# title"). = ("cheie"); val (); var t = db.transaction (["notă"]; "readwrite"); adăugați (title: title, body: corp, actualizat: new Date ()); altceva t.objectStore ("note" id: număr (cheie)); t.oncomplete = funcție (eveniment) $ ("# cheie") val (" #body ") val (" "); displayNotes (); $ noteForm.hide ();; return false;); );

Următorul pas interesant este Salvați metodă. Trebuie să folosim un pic de logică pentru a determina dacă adăugăm sau actualizăm, dar chiar și acest lucru este destul de simplu. Si asta e! O aplicație completă, dacă este simplă, IndexedDB. Puteți juca singur cu demo-ul prin descărcarea codului sursă atașat.


In concluzie

Asta e pentru partea a doua! Cel de-al treilea articol va prelua această aplicație și va începe să adauge caracteristici suplimentare, inclusiv proprietăți bazate pe căutare și array.

Cod