Einführung
IndexedDB ist eine HTML5-WEB-Datenbank, die es HTML5-WEB-Anwendungen ermöglicht, Daten im Browser des Benutzers zu speichern. IndexedDB ist sehr leistungsstark und nützlich für Anwendungen. Es kann große Datenmengen in Chrome, IE, Firefox und anderen WEB-Browsern speichern. Hier finden Sie eine kurze Einführung in die Grundkonzepte von IndexedDB.
Was ist IndexedDB?
IndexedDB, der neue Datenspeicher von HTML5, kann Daten auf dem Client speichern und verwalten, wodurch Anwendungen schneller geladen werden und besser reagieren. Sie unterscheidet sich von einer relationalen Datenbank dadurch, dass sie über Datentabellen und Datensätze verfügt. Es beeinflusst die Art und Weise, wie wir Anwendungen entwerfen und erstellen. IndexedDB erstellt Objekte mit Datentypen und einfachen persistenten JavaScript-Objekten. Jedes Objekt kann einen Index haben, wodurch die gesamte Sammlung effizient abgefragt und durchlaufen werden kann. In diesem Artikel finden Sie ein reales Beispiel für die Verwendung von IndexedDB in einer Webanwendung.
Start
Wir müssen vor der Ausführung den folgenden Vorcode einfügen
JavaScript CodeInhalt in die Zwischenablage kopieren
-
var indexedDB = window.indexedDB ||. window.mozIndexedDB || |. window.msIndexedDB;
-
-
//Präfixe von window.IDB-Objekten
-
var IDBTransactionwindow.IDBTransaction ||. window.msIDBTransaction;
var
- IDBKeyRange = window.IDBKeyRange ||. window.msIDBKeyRange
-
if (!indexedDB) {
-
alert("Ihr Browser unterstützt keine stabile Version von IndexedDB.")
-
}
-
IndexedDB öffnen
Bevor wir die Datenbank erstellen, müssen wir zunächst Daten für die Datenbank erstellen:
JavaScript
CodeInhalt in die Zwischenablage kopieren
var -
userData = [
{ id: „1“, Name: „Tapas“, Alter: 33, E-Mail: „tapas@example.com“ },
-
{ id: „2“, Name: „Bidulata“, Alter: 55, E-Mail: „bidu@home.com“ }
-
];
-
Jetzt müssen wir unsere Datenbank mit der open()-Methode öffnen:
JavaScript
Code
Inhalt in die Zwischenablage kopieren
-
var db;
-
var request = indexedDB.open("databaseName", 1);
-
-
request.onerror = function(e) {
-
console.log("error: ", e);
-
};
-
-
request.onsuccess = function(e) {
-
db = request.result;
-
console.log("success: " db);
-
};
-
request.onupgradeneeded = Funktion(e) {
-
-
}
如上所示,我们已经打开了名为"databaseName",指定版本号的数据库,open()方法有两个参数:
1.第一个参数是数据库名称, 它会检测名称为„databaseName“的数据库是否已经存在, 如果存在则打开它, 否则创建新的数据库.
2.第二个参数是数据库的版本,用于用户更新数据库结构.
onSuccess 处理赋值给db变量保存请求的结果供以后使用.
onerror的处理程序
发生错误事件时“onerror“被触发,如果打开数据库的过程中失败.
Onupgradeneeded处理程序
如果你想更更新数据库(创建,删除或修改数据库),那么你必须实现onupgradeneeded处理程序,使您可以在数据库中做任何更改. 在„onupgradeneeded“处理程序中是可以改变数据库的结构的唯一地方.
创建和添加数据到表:
IndexedDB使用对象存储来存储数据,而不是通过表。 每当一个值存储在对象存储中,它与一个键相关联. 它允许我们创建的任何索引允许我们访问存储在对象存储中的值储并插入预先准备好的数据:
JavaScript Code复制内容到剪贴板
- request.onupgradeneeded = Funktion(Ereignis) {
var -
objectStore = event.target.result.createObjectStore("users", {keyPath: "id "});
für (var i in userData) { -
objectStore.add(userData[i]); -
} -
} -
Wir erstellen einen Objektspeicher mit der Methode createObjectStore(). Diese Methode akzeptiert zwei Parameter: - den gespeicherten Namen und das Parameterobjekt. Hier haben wir einen Objektspeicher namens „users“ und definieren den keyPath, das Attribut, das das Objekt einzigartig macht. Hier verwenden wir „id“ als keyPath, dieser Wert ist im Objektspeicher eindeutig und wir müssen sicherstellen, dass das Attribut dieser „ID“ in jedem Objekt im Objektspeicher vorhanden ist. Sobald der Objektspeicher erstellt ist, können wir mit dem Hinzufügen von Daten mithilfe einer for-Schleife beginnen.
Daten manuell zur Tabelle hinzufügen:
Wir können der Datenbank manuell zusätzliche Daten hinzufügen.
JavaScript CodeInhalt in die Zwischenablage kopieren
-
Funktion Add() {
-
var request = db.transaction(["users"], "readwrite").objectStore( „Benutzer“)
- .add({ id: „3“, Name: „Gautam“, Alter: 30, E-Mail: „gautam@store.org“ });
-
-
request.onsuccess = function(e) {
alert("Gautam wurde zur Datenbank hinzugefügt."); -
}; -
-
-
request.onerror = function(e) {
alert("Die Informationen können nicht hinzugefügt werden."); -
} -
-
} -
Bevor wir eine CRUD-Operation (Lesen, Schreiben, Ändern) in der Datenbank durchführten, mussten wir Transaktionen verwenden. Die Methode „transaktion()“ wird verwendet, um den Objektspeicher anzugeben, den wir für die Transaktionsverarbeitung durchführen möchten. Die Methode „transaktion()“ akzeptiert drei Parameter (der zweite und dritte sind optional). Die erste ist die Liste der Objektspeicher, die wir verarbeiten möchten, die zweite gibt an, ob wir nur lesen/lesen/schreiben möchten, und die dritte ist die Versionsänderung.
Daten aus einer Tabelle lesen
Die Methode get() wird verwendet, um Daten aus dem Objektspeicher abzurufen. Wir haben zuvor die ID des Objekts als keyPath festgelegt, sodass die Methode get() ein Objekt mit demselben ID-Wert findet. Der folgende Code gibt ein Objekt mit dem Namen „Bidulata“ zurück:
JavaScript
CodeInhalt in die Zwischenablage kopieren
-
Funktion Read() {
-
var objectStore = db.transaction(["users"]).objectStore("users") ;
-
var request = objectStore.get("2");
-
request.onerror = function(event) {
-
alert("Daten können nicht aus der Datenbank abgerufen werden!");
-
};
-
request.onsuccess = Funktion(Ereignis) {
-
if(request.result) {
-
alert("Name: " request.result.name ", Alter: " request.result.age ", E-Mail: " request.result.email);
-
} else {
-
alert("Bidulata konnte nicht in Ihrer Datenbank gefunden werden!");
-
}
-
};
-
}
从表中读取所有数据
下面的方法检索表中的所有数据。 这里我们使用游标来检索对象存储中的所有数据:
JavaScript Code复制内容到剪贴板
-
Funktion ReadAll() {
-
var objectStore = db.transaction("users").objectStore("users");
-
var req = objectStore.openCursor();
-
req.onsuccess = function(event) {
-
db.close();
-
var res = event.target.result;
-
if (res) {
-
alert("Key " res.key " is " res.value.name ", Age: " res.value.age ", Email: " res.value.email);
-
res.continue();
-
}
-
};
-
req.onerror = function (e) {
-
console.log("Fehler beim Abrufen: ", e);
-
};
-
}
该openCursor()用于遍历数据库中的多个记录。 在continue()函数中继续读取下一条记录。
删除表中的记录
下面的方法从对象中删除记录.
JavaScript Code复制内容到剪贴板
-
Funktion Remove() {
-
var request = db.transaction(["users"], "readwrite").objectStore( "Benutzer").delete("1");
-
request.onsuccess = Funktion(Ereignis) {
- alert("Tapas' Eintrag wurde aus Ihrer Datenbank entfernt.");
}; -
} -
Wir müssen den keyPath des Objekts als Parameter an die Methode delete() übergeben.
Endgültiger Code
Die folgende Methode löscht einen Datensatz aus der Objektquelle:
JavaScript
CodeInhalt in die Zwischenablage kopieren
-
>
-
<Kopf>
-
<meta http-equiv=" Content-Type" content="text/html; charset=utf-8" />
-
<title>IndexedDBTitel>
-
<script type="text/ Javascript">
-
var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
-
-
//Präfixe von window.IDB-Objekten
-
var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
-
var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
-
-
if (!indexedDB) {
-
alert("Ihr Browser unterstützt keine stabile Version von IndexedDB.")
-
}
-
var customerData = [
-
{ id: "1", Name: "Tapas", Alter: 33, E-Mail: "tapas@example.com" },
-
{ id: "2", Name: "Bidulata", Alter: 55, E-Mail: "bidu@home.com" }
-
];
-
var db;
-
var request = indexedDB.open("newDatabase", 1);
-
-
request.onerror = function(e) {
-
console.log("error: ", e);
-
};
-
-
request.onsuccess = function(e) {
-
db = request.result;
-
console.log("success: " db);
-
};
-
-
request.onupgradeneeded = Funktion(Ereignis) {
-
-
}
-
request.onupgradeneeded = Funktion(Ereignis) {
-
var objectStore = event.target.result.createObjectStore("users", {keyPath: "id "});
-
für (var i in userData) {
-
objectStore.add(userData[i]);
-
}
-
}
-
Funktion Add() {
-
var request = db.transaction(["users"], "readwrite")
-
.objectStore("users")
-
.add({ id: "3", Name: "Gautam", Alter: 30, E-Mail: "gautam@store.org" });
-
-
request.onsuccess = function(e) {
-
alert("Gautam wurde der Datenbank hinzugefügt.");
-
};
-
-
request.onerror = function(e) {
-
alert("Die Informationen konnten nicht hinzugefügt werden.");
-
}
-
-
}
-
Funktion Read() {
-
var objectStore = db.transaction("users").objectStore("users");
-
var request = objectStore.get("2");
-
request.onerror = function(event) {
-
alert("Daten können nicht aus der Datenbank abgerufen werden!");
-
};
-
request.onsuccess = Funktion(Ereignis) {
-
if(request.result) {
-
alert("Name: " request.result.name ", Alter: " request.result.age ", E-Mail: " request.result.email);
-
} else {
-
alert("Bidulata konnte nicht in Ihrer Datenbank gefunden werden!");
-
}
-
};
-
}
-
Funktion ReadAll() {
-
var objectStore = db.transaction("users").objectStore("users");
-
var req = objectStore.openCursor();
-
req.onsuccess = function(event) {
-
db.close();
-
var res = event.target.result;
-
if (res) {
-
alert("Key " res.key " is " res.value.name ", Age: " res.value.age ", Email: " res.value.email);
-
res.continue();
-
}
-
};
-
req.onerror = function (e) {
-
console.log("Fehler beim Abrufen: ", e);
-
};
-
}
-
Funktion Remove() {
-
var request = db.transaction(["users"], "readwrite").objectStore( "Benutzer").delete("1");
-
request.onsuccess = Funktion(Ereignis) {
-
alert("Der Eintrag von Tapas wurde aus Ihrer Datenbank entfernt.");
-
};
-
}
-
Skript>
-
Kopf>
-
-
<Körper>
-
<button onclick="Add( )">Datensatz hinzufügenSchaltfläche>
-
<Schaltfläche onclick="Entfernen( )">Datensatz löschenSchaltfläche>
-
<Schaltfläche onclick="Lesen( )">Einzelnen Datensatz abrufenSchaltfläche>
-
<button onclick="ReadAll( )">Alle Datensätze abrufenSchaltfläche>
-
Körper>
-
html>
锁
localStorage是不带lock功能的.那就需要使用其它本储存方式,比如indexedDB.indedDB使用的是事务处理的机制,那实际上就是lock功能。
做这个测试需要先简单的封装下indexedDB的操作, 因为indexedDB的连接比较麻烦,而且两个测试页面都需要用到
JavaScript Code复制内容到剪贴板
-
//db.js
-
//Transaktionsvorgänge kapseln
-
IDBDatabase.prototype.doTransaction=Funktion(f){
- f(this.transaction(["Obj"],"readwrite").objectStore("Obj"));
}; -
//Stellen Sie eine Verbindung zur Datenbank her und rufen Sie nach Erfolg die Hauptfunktion auf -
(function(){ -
//Datenbank öffnen -
var -
cn=indexedDB.open("TestDB",1);
//Datenobjekt erstellen
-
cn.onupgradeneeded-
=function(e){
e.target.result.createObjectStore("Obj");
}; -
//Datenbankverbindung erfolgreich -
- cn.onsuccess
=-
function(e){
main(e.target.result);
}; -
})(); -
Dann gibt es noch zwei Testseiten -
-
<
script- src="db. js">script>
<
Skript- >
//a.html
Funktion main(e){ -
(function callee(){ -
//Eine Transaktion starten -
e.doTransaction(function(e){ -
e.put(1,"test"); //Setze den Wert von test auf 1 -
e.put(2,"test"); //Setze den Wert von test auf 2 -
}); -
setTimeout(callee); -
})(); -
};
-
script>
-
<script src="db. js">script>
-
<script>
-
//b.html
-
fonction principale(e){
-
(fonction appelée(){
-
//Démarrer une transaction
-
e.doTransaction(function(e){
-
//Obtenir la valeur du test
-
e.get("test").onsuccess=fonction(e){
-
console.log(e.target.result);
-
};
-
});
-
setTimeout(appelé);
-
})();
-
};
-
script>
Remplacez localStorage par le traitement des transactions indexedDB. Mais le résultat est différent
Pendant le test, il se peut qu'il n'y ait pas de sortie immédiate dans b.html car indexedDB est occupé à traiter les éléments a.html et la transaction b.html est en attente dans la file d'attente des transactions. Quoi qu’il en soit, le résultat de sortie ne sera pas la valeur 1. Parce que la plus petite unité de traitement d'indexedDB est une transaction, pas une expression comme localStorage. De cette façon, il vous suffit de mettre dans une transaction les éléments qui doivent être traités entre le verrouillage et le déverrouillage. De plus, la prise en charge par le navigateur d'indexedDB n'est pas aussi bonne que celle de localStorage, la compatibilité du navigateur doit donc être prise en compte lors de son utilisation.