详细介绍
IndexedDB是HTML5 WEB数据信息库,容许HTML5 WEB运用在客户访问器端储存数据信息。针对运用来讲IndexedDB十分强劲、有效,能够在顾客端chrome,IE,Firefox等WEB访问器中储存很多数据信息,下面简易详细介绍1下IndexedDB的基础定义。
甚么是IndexedDB
IndexedDB,HTML5新的数据信息储存,能够在顾客端储存、实际操作数据信息,可使运用载入地更快,更好地回应。它不一样于关联型数据信息库,有着数据信息表、纪录。它危害着大家设计方案和建立运用程序流程的方法。IndexedDB 建立了解据种类和简易的JavaScript长久目标的object,每一个object能够有数据库索引,使其合理地查寻和遍历全部结合。本文为您出示了怎样在Web运用程序流程中应用IndexedDB的真正事例。
刚开始
大家必须在实行前包括下眼前置编码
JavaScript Code拷贝內容到剪贴板
- var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
-
- //prefixes of window.IDB objects
- var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
- var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
-
- if (!indexedDB) {
- alert("Your browser doesn't support a stable version of IndexedDB.")
- }
开启IndexedDB
在建立数据信息库以前,大家最先必须为数据信息库建立数据信息,假定大家有以下的客户信息内容:
JavaScript Code拷贝內容到剪贴板
- var userData = [
- { id: "1", name: "Tapas", age: 33, email: "tapas" },
- { id: "2", name: "Bidulata", age: 55, email: "bidu" }
- ];
如今大家必须用open()方式开启大家的数据信息库:
JavaScript Code拷贝內容到剪贴板
- 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 = function(e) {
-
- }
如上所示,大家早已开启了名为"databaseName",特定版本号号的数据信息库,open()方式有两个主要参数:
1.第1个主要参数是数据信息库名字,它会检验名字为"databaseName"的数据信息库是不是早已存在,假如存在则开启它,不然建立新的数据信息库。
2.第2个主要参数是数据信息库的版本号,用于客户升级数据信息库构造。
onSuccess解决
产生取得成功恶性事件时“onSuccess”被开启,假如全部取得成功的恳求都在此解决,大家能够根据取值给db自变量储存恳求的結果供之后应用。
onerror的解决程序流程
产生不正确恶性事件时“onerror”被开启,假如开启数据信息库的全过程中不成功。
Onupgradeneeded解决程序流程
假如你想升级数据信息库(建立,删掉或改动数据信息库),那末你务必完成onupgradeneeded解决程序流程,使您能够在数据信息库中做任何变更。 在“onupgradeneeded”解决程序流程中是能够更改数据信息库的构造的唯1地区。
建立和加上数据信息到表:
IndexedDB应用目标储存来储存数据信息,而并不是根据表。 每当1个值储存在目标储存中,它与1个键有关联。 它容许大家建立的任何目标储存数据库索引。 数据库索引容许大家浏览储存在目标储存中的值。 下面的编码显示信息了怎样建立目标储存并插进预先提前准备好的数据信息:
JavaScript Code拷贝內容到剪贴板
- request.onupgradeneeded = function(event) {
- var objectStore = event.target.result.createObjectStore("users", {keyPath: "id"});
- for (var i in userData) {
- objectStore.add(userData[i]);
- }
- }
大家应用createObjectStore()方式建立1个目标储存。 此方式接纳两个主要参数: - 储存的名字和主要参数目标。 在这里,大家有1个名为"users"的目标储存,并界定了keyPath,这是目标唯1性的特性。 在这里,大家应用“id”做为keyPath,这个值在目标储存中是唯1的,大家务必保证该“ID”的特性在目标储存中的每一个目标中存在。 1旦建立了目标储存,大家能够刚开始应用for循环系统加上数据信息进去。
手动式将数据信息加上到表:
大家能够手动式加上附加的数据信息到数据信息库中。
JavaScript Code拷贝內容到剪贴板
- function Add() {
- var request = db.transaction(["users"], "readwrite").objectStore("users")
- .add({ id: "3", name: "Gautam", age: 30, email: "gautam@store.org" });
-
- request.onsuccess = function(e) {
- alert("Gautam has been added to the database.");
- };
-
- request.onerror = function(e) {
- alert("Unable to add the information.");
- }
-
- }
以前大家在数据信息库中做任何的CRUD实际操作(读,写,改动),务必应用事务管理。 该transaction()方式是用来特定大家要想开展事务管理解决的目标储存。 transaction()方式接纳3个主要参数(第2个和第3个是可选的)。 第1个是大家要解决的目标储存的目录,第2个特定大家是不是要写保护/读写能力,第3个是版本号转变。
从表格中载入数据信息
get()方式用于从目标储存中查找数据信息。 大家以前早已设定目标的id做为的keyPath,因此get()方式将搜索具备同样id值的目标。 下面的编码将回到大家取名为“Bidulata”的目标:
JavaScript Code拷贝內容到剪贴板
- function Read() {
- var objectStore = db.transaction(["users"]).objectStore("users");
- var request = objectStore.get("2");
- request.onerror = function(event) {
- alert("Unable to retrieve data from database!");
- };
- request.onsuccess = function(event) {
- if(request.result) {
- alert("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email);
- } else {
- alert("Bidulata couldn't be found in your database!");
- }
- };
- }
从表格中载入全部数据信息
下面的方式查找表格中的全部数据信息。 这里大家应用游标来查找目标储存中的全部数据信息:
JavaScript Code拷贝內容到剪贴板
- function 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("Error Getting: ", e);
- };
- }
该openCursor()用于遍历数据信息库中的好几个纪录。 在continue()涵数中再次载入下1条纪录。
删掉表格中的纪录
下面的方式从目标中删掉纪录。
JavaScript Code拷贝內容到剪贴板
- function Remove() {
- var request = db.transaction(["users"], "readwrite").objectStore("users").delete("1");
- request.onsuccess = function(event) {
- alert("Tapas's entry has been removed from your database.");
- };
- }
大家要将目标的keyPath做为主要参数传送给delete()方式。
最后编码
下面的方式从目标源中删掉1条纪录:
JavaScript Code拷贝內容到剪贴板
- <!DOCTYPE html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf⑻" />
- <title>IndexedDB</title>
- <script type="text/javascript">
- var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
-
- //prefixes of window.IDB objects
- var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
- var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
-
- if (!indexedDB) {
- alert("Your browser doesn't support a stable version of IndexedDB.")
- }
- var customerData = [
- { id: "1", name: "Tapas", age: 33, email: "tapas" },
- { id: "2", name: "Bidulata", age: 55, email: "bidu" }
- ];
- 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 = function(event) {
-
- }
- request.onupgradeneeded = function(event) {
- var objectStore = event.target.result.createObjectStore("users", {keyPath: "id"});
- for (var i in userData) {
- objectStore.add(userData[i]);
- }
- }
- function Add() {
- var request = db.transaction(["users"], "readwrite")
- .objectStore("users")
- .add({ id: "3", name: "Gautam", age: 30, email: "gautam@store.org" });
-
- request.onsuccess = function(e) {
- alert("Gautam has been added to the database.");
- };
-
- request.onerror = function(e) {
- alert("Unable to add the information.");
- }
-
- }
- function Read() {
- var objectStore = db.transaction("users").objectStore("users");
- var request = objectStore.get("2");
- request.onerror = function(event) {
- alert("Unable to retrieve data from database!");
- };
- request.onsuccess = function(event) {
- if(request.result) {
- alert("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email);
- } else {
- alert("Bidulata couldn't be found in your database!");
- }
- };
- }
- function 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("Error Getting: ", e);
- };
- }
- function Remove() {
- var request = db.transaction(["users"], "readwrite").objectStore("users").delete("1");
- request.onsuccess = function(event) {
- alert("Tapas's entry has been removed from your database.");
- };
- }
- </script>
- </head>
-
- <body>
- <button onclick="Add()">Add record</button>
- <button onclick="Remove()">Delete record</button>
- <button onclick="Read()">Retrieve single record</button>
- <button onclick="ReadAll()">Retrieve all records</button>
- </body>
- </html>
锁
localStorage是不带lock作用的。那末要完成前端开发的数据信息共享资源而且必须lock作用那就必须应用其它本存储方法,例如indexedDB。indededDB应用的是事务管理解决的体制,那具体上便是lock作用。
做这个检测必须先简易的封裝下indexedDB的实际操作,由于indexedDB的联接较为不便,并且两个检测网页页面都必须用到
JavaScript Code拷贝內容到剪贴板
- //db.js
- //封裝事务管理实际操作
- IDBDatabase.prototype.doTransaction=function(f){
- f(this.transaction(["Obj"],"readwrite").objectStore("Obj"));
- };
- //联接数据信息库,取得成功后启用main涵数
- (function(){
- //开启数据信息库
- var cn=indexedDB.open("TestDB",1);
- //建立数据信息目标
- cn.onupgradeneeded=function(e){
- e.target.result.createObjectStore("Obj");
- };
- //数据信息库联接取得成功
- cn.onsuccess=function(e){
- main(e.target.result);
- };
- })();
- 接着是两个检测网页页面
- <script src="db.js"></script>
- <script>
- //a.html
- function main(e){
- (function callee(){
- //刚开始1个事务管理
- e.doTransaction(function(e){
- e.put(1,"test"); //设定test的值为1
- e.put(2,"test"); //设定test的值为2
- });
- setTimeout(callee);
- })();
- };
- </script>
- <script src="db.js"></script>
- <script>
- //b.html
- function main(e){
- (function callee(){
- //刚开始1个事务管理
- e.doTransaction(function(e){
- //获得test的值
- e.get("test").onsuccess=function(e){
- console.log(e.target.result);
- };
- });
- setTimeout(callee);
- })();
- };
- </script>
把localStorage换为了indexedDB事务管理解决。可是結果就不一样
检测的情况下b.html中将会不容易马上有輸出,由于indexedDB正忙着解决a.html物品,b.html事务管理丢在了事务管理丢序列中等候。可是不管怎样,輸出結果也不容易是1这个值。由于indexedDB的最少解决企业是事务管理,而并不是localStorage那样以表述式为企业。这样要是把lock和unlock之间必须解决的物品放入1个事务管理中便可完成。此外,访问器对indexedDB的适用比不上localStorage,因此应用时还得考虑到访问器适配。