HTML5之IndexedDB初识

HTML5 的一个重要特性是本地数据持久性,它使用户能够在线和离线访问 Web 应用程序。

此外,本地数据持久性使移动应用程序更灵敏,使用的带宽更少,而且能够在低带宽场景中更高效地工作。

HTML5 提供了一些本地数据持久性选项:

localstorage:它支持您使用一个简单的键值对来存储数据。

IndexedDB:支持您本地存储大量对象,并使用健壮的数据访问机制检索数据。

 

IndexedDB API 取代了 Web Storage API,后者在 HTML5 规范中已不推荐使用

(但一些领先的浏览器仍然支持 Web Storage,其中包括苹果公司的 Safari 和 Opera Web 浏览器)与 Web Storage 相比,IndexedDB 具有多个优势,

其中包括索引事务处理健壮的查询功能

 

使用IndexedDB:

一个数据库一次只能有一个版本。在首次创建数据库时,它的初始版本编号为 0。创建数据库之后,数据库(和它的对象存储)只能通过一种称为 versionchange 的特殊类型的事务来更改。要在创建数据库后更改它,必须打开具有更高版本的数据库。此操作会触发 upgradeneeded 事件。修改数据库或对象存储的代码必须位于 upgradeneeded 事件处理函数中。

简单使用例子:

 

// 兼容不同浏览器的indexedDB.
        window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
        
        var database = {
            name: "TEST", // 数据库
            version: "1", // 数据库版本,默认值=1
            store: "TESTSTORE", // 对象存储(表)
        },
        html5rocks = html5rocks || {};

        html5rocks.indexedDB = {};
        html5rocks.indexedDB.db = null;

        // 创建数据库
        html5rocks.indexedDB.open = function () {
            // open方法不是立即打开数据库,而是一个请求并返回IDBRequest对象
            var request = indexedDB.open(database.name, database.version);

            // 数据库发生改变或第一次创建数据库时触发此事件。即:数据库版本发生更改时触发
            request.onupgradeneeded = function (e) {
                var db = e.target.result;
                if (!db.objectStoreNames.contains(database.store)) {
                    // 创建对象存储表 keyPath -主键名称
                    var objStore = db.createObjectStore(database.store, { keyPath: "id", autoIncrement: true });
                    // 创建索引 第一个参数:索引名称,第二个参数:索引列,unique - 唯一性
                    objStore.createIndex("id", "id", { unique: false });
                }
            };

            // 请求打开数据库发生错误时触发
            request.onerror = function (e) {
                console.log("Error to open db:" + database.name);
            };

            // 请求打开数据库成功时触发
            request.onsuccess = function (e) {
                html5rocks.indexedDB.db = e.target.result; // 将IDBRequest对象分配给 html5rocks.indexedDB.db
                console.log("Success to open db:" + database.name);
            };
        };

        // 删除数据库 db - string
        html5rocks.indexedDB.deleteDB = function (db) {
            indexedDB.deleteDatabase(db);
        };

        // insert数据 参数为-Object
        html5rocks.indexedDB.insert = function (objData) {
            // 读写 的事务
            var trans = html5rocks.indexedDB.db.transaction(database.store, "readwrite"),
                store = trans.objectStore(database.store);

            store.add(objData);

        };

        // updata数据 参数必须包含主键的对象
        html5rocks.indexedDB.updata = function (objData) {
            var trans = html5rocks.indexedDB.db.transaction(database.store, "readwrite"),
                store = trans.objectStore(database.store);

            store.put(objData);
        };

        // delete数据 参数为主键值
        html5rocks.indexedDB.delete = function (key) {
            var trans = html5rocks.indexedDB.db.transaction(database.store, "readwrite"),
                store = trans.objectStore(database.store);

            store.delete(key);
        };

        // 清除表(store)的所有记录
        html5rocks.indexedDB.clearObjectStore = function (store) {
            var objStore = store || database.store;
            var trans = html5rocks.indexedDB.db.transaction(objStore, "readwrite"),
                store = trans.objectStore(objStore);

            store.clear();
        };

        // 根据主键值获取记录,并返回对象  callback(arg) - 回调函数 参数接受返回的对象
        html5rocks.indexedDB.getDataByKey = function (key, callback) {
            // 只读事务
            var trans = html5rocks.indexedDB.db.transaction(database.store, "readonly"),
                store = trans.objectStore(database.store),
                request = store.get(key);
            request.onerror = function (e) {
                console.log("Error to get data by key:" + key);
            };
            request.onsuccess = function (e) {
                if (!!callback) {
                    Function.call(callback(e.target.result));
                }
            };
        };

        // 根据指定索引 查询获取相应的数据
        html5rocks.indexedDB.getDataByIndex = function (index, value, callback) {
            var trans = html5rocks.indexedDB.db.transaction(database.store),
               store = trans.objectStore(database.store),
               indexRequest = store.index(index),
               request = indexRequest.get(value);
            request.onerror = function (e) {
                console.log("Request error for index. ");
            };
            request.onsuccess = function (e) {
                if (!!callback) {
                    Function.call(callback(e.target.result));
                }
            };
        };

        // 根据游标获取所有数据 返回数组对象
        html5rocks.indexedDB.getDataListByCursor = function (callback) {
            var trans = html5rocks.indexedDB.db.transaction(database.store),
               store = trans.objectStore(database.store),
               request = store.openCursor(),
               lst = [];
            request.onerror = function (e) {
                console.log("Request error for cursor.");
            };
            request.onsuccess = function (e) {
                var cursor = e.target.result;

                if (cursor) {
                    lst.push(cursor.value);
                    cursor.continue();
                } else {
                    if (!!callback) {
                        Function.call(callback(lst));
                    }
                }
            };
        };
View Code

 

posted @ 2014-09-05 11:23  苟且偷生脱苦海  阅读(109)  评论(0)    收藏  举报