之前的文章(http://www.cnblogs.com/wzh2010/archive/2012/05/22/2514017.html)里面描述了HTML5 離線數(shù)據(jù)存儲(chǔ)的Web SQL,一個(gè)基于SQLite 的離線數(shù)據(jù)庫(kù),不過(guò)W3C 的 WebDatabase 規(guī)范中說(shuō)這份規(guī)范不再維護(hù)了,取而代之的是IndexDB,一個(gè)NoSQL類(lèi)型的數(shù)據(jù)庫(kù)。
Html5Rocks把他們的優(yōu)缺點(diǎn)做了比對(duì),IndexDB綜合看來(lái)有如下優(yōu)點(diǎn):
允許快速索引和搜索的對(duì)象,所以在HTML5 的 web應(yīng)用程序中, 你可以有效管理你的數(shù)據(jù)和高效率的讀/寫(xiě)操作。
W3C主推的離線數(shù)據(jù)庫(kù)類(lèi)型,逐漸替代Web SQL類(lèi)型數(shù)據(jù)庫(kù),更新效率高并不斷完善。
工作在異步模式下執(zhí)行每步操作。讓你使用高效率的的JavaScript事件驅(qū)動(dòng)模塊
現(xiàn)在我們來(lái)嘗試使用這個(gè)IndexDB:
1、初始化聲明
1 var dbName = "H5AppDB"; //數(shù)據(jù)庫(kù)名稱2 var dbVersion = 2.0; //數(shù)據(jù)庫(kù)版本3 var tablename = "todo"; //表名
2、初始并實(shí)例化IndexDB數(shù)據(jù)上下文
1 //定義一個(gè)IndexDB方法集合對(duì)象 2 var H5AppDB = {}; 3 4 //實(shí)例化IndexDB數(shù)據(jù)上下文,這邊根據(jù)瀏覽器類(lèi)型來(lái)做選擇 5 var indexedDB = window.indexedDB || window.webkitIndexedDB ||window.mozIndexedDB; 6 7 if ('webkitIndexedDB' in window) { 8 window.IDBTransaction = window.webkitIDBTransaction; 9 window.IDBKeyRange = window.webkitIDBKeyRange;10 }11 12 H5AppDB.indexedDB = {};13 H5AppDB.indexedDB.db = null;14 15 //錯(cuò)誤信息,打印日志16 H5AppDB.indexedDB.onerror = function (e) {17 log.debug(e);18 };
3、打開(kāi)數(shù)據(jù)庫(kù),初始化數(shù)據(jù)庫(kù),并創(chuàng)建存儲(chǔ)對(duì)象
1 H5AppDB.indexedDB.open = function () { 2 3 //初始IndexDB 4 var request = indexedDB.open(dbName, dbVersion); 5 6 request.onsuccess = function (e) { 7 // Old api: var v = "2-beta"; 8 log.debug("success to open DB: " + dbName); 9 H5AppDB.indexedDB.db = e.target.result;10 var db = H5AppDB.indexedDB.db;11 if (db.setVersion) {12 console.log("in old setVersion: " + db.setVersion);13 if (db.version != dbVersion) {14 var req = db.setVersion(dbVersion);15 req.onsuccess = function () {16 if (db.objectStoreNames.contains(tablename)) {17 db.deleteObjectStore(tablename);18 }19 var store = db.createObjectStore(tablename, { keyPath: "timeStamp" });//keyPath:主鍵,唯一性20 21 var trans = req.result;22 trans.oncomplete = function (e) {23 console.log("== trans oncomplete ==");24 H5AppDB.indexedDB.getAllTodoItems();25 }26 };27 }28 else {29 H5AppDB.indexedDB.getAllTodoItems();30 }31 }32 else {33 H5AppDB.indexedDB.getAllTodoItems();34 }35 }36 37 //如果版本不一致,執(zhí)行版本升級(jí)的操作38 request.onupgradeneeded = function (e) {39 log.debug("going to upgrade our DB!");40 41 H5AppDB.indexedDB.db = e.target.result;42 var db = H5AppDB.indexedDB.db;43 if (db.objectStoreNames.contains(tablename)) {44 db.deleteObjectStore(tablename);45 }46 47 var store = db.createObjectStore(tablename, { keyPath: "timeStamp" });//NoSQL類(lèi)型數(shù)據(jù)庫(kù)中必須的主鍵,唯一性48 49 H5AppDB.indexedDB.getAllTodoItems();50 }51 52 request.onfailure = H5AppDB.indexedDB.onerror;53 };
4、獲取對(duì)象信息,并進(jìn)行輪詢讀取,然后綁定到頁(yè)面
1 //、獲取對(duì)象信息 2 H5AppDB.indexedDB.getAllTodoItems = function () { 3 4 var todos = document.getElementById("todoItems"); 5 todos.innerHTML = ""; 6 7 8 9 var db = H5AppDB.indexedDB.db;10 var trans = db.transaction([tablename], "readwrite");//通過(guò)事物開(kāi)啟對(duì)象11 var store = trans.objectStore(tablename);//獲取到對(duì)象的值12 13 // Get everything in the store;14 15 var keyRange = IDBKeyRange.lowerBound(0);16 var cursorRequest = store.openCursor(keyRange);//開(kāi)啟索引為0的表17 18 cursorRequest.onsuccess = function (e) {19 20 var result = e.target.result;21 22 if (!!result == false)23 return;24 25 renderTodo(result.value);26 result.continue();//這邊執(zhí)行輪詢讀取27 };28 29 cursorRequest.onerror = H5AppDB.indexedDB.onerror;30 };31 32 //綁定數(shù)據(jù)33 function renderTodo(row) {34 var todos = document.getElementById("todoItems");35 var li = document.createElement("li");36 var a = document.createElement("a");37 var t = document.createTextNode(row.text);38 39 a.addEventListener("click", function() {40 H5AppDB.indexedDB.deleteTodo(row.timeStamp);41 }, false);42 43 a.textContent = " [Delete]";44 li.appendChild(t);45 li.appendChild(a);46 todos.appendChild(li);47 };
效果如下:
5、添加數(shù)據(jù)對(duì)象
1 //4、添加數(shù)據(jù)對(duì)象 2 H5AppDB.indexedDB.addTodo = function (todoText) { 3 var db = H5AppDB.indexedDB.db; 4 var trans = db.transaction([tablename], "readwrite"); 5 var store = trans.objectStore(tablename); 6 7 var newArray = new Array("wzh","374532"); 8 9 //數(shù)據(jù)以對(duì)象形式保存,體現(xiàn)NoSQL類(lèi)型數(shù)據(jù)庫(kù)的靈活性10 var data = {11 "text": todoText,12 "timeStamp": new Date().getTime(),13 "obj":newArray 14 };15 16 var request = store.put(data);//保存數(shù)據(jù)17 18 request.onsuccess = function (e) {19 H5AppDB.indexedDB.getAllTodoItems();20 };21 22 request.onerror = function (e) {23 log.debug("Error Adding: ", e);24 };25 }; 26 function addTodo() {27 var todo = document.getElementById("todo");28 H5AppDB.indexedDB.addTodo(todo.value);29 todo.value = "";30 }
可以隨意添加BJson格式的對(duì)象,體現(xiàn)NoSQl類(lèi)型數(shù)據(jù)庫(kù)的優(yōu)越性...
6、刪除數(shù)據(jù)對(duì)象(根據(jù)主鍵刪除)
1 2 // 刪除數(shù)據(jù)對(duì)象 3 H5AppDB.indexedDB.deleteTodo = function(id) { 4 var db = H5AppDB.indexedDB.db; 5 var trans = db.transaction([tablename], "readwrite"); 6 var store = trans.objectStore(tablename); 7 8 var request = store.delete(id);//根據(jù)主鍵來(lái)刪除 9 10 request.onsuccess = function(e) {11 12 H5AppDB.indexedDB.getAllTodoItems();13 alert("刪除成功");14 };15 16 request.onerror = function(e) {17 log.debug("Error Adding: ", e);18 };19 };
W3C已經(jīng)停止了對(duì)Web SQL 的更新,會(huì)更加完善對(duì)Index的規(guī)范草案和標(biāo)準(zhǔn),所以以后的HTML5應(yīng)用,有用到離線端數(shù)據(jù)庫(kù)這一塊,建議優(yōu)先考慮IndexDB...
聯(lián)系客服