浏览器数据库IndexedDB介绍

摘要
在移动端H5页面开发的时候,为了更好的提高用户体验,可以对不常变化的数据做浏览器端数据缓存,在用户打开页面的时候,首先加载本地的数据,然后异步请求服务端,更新数据。在移动端webview中,可以使用IndexedDB的方式对数据进行存储。当然如果数据量不大的情况下,localstorage也是一种选择。

什么是IndexedDB
一般来说,数据库分两种类型:关系型和文档型(也称NoSQL或者对象)。关系型数据库如SQL Server,MySQL,Oracle的数据存储在表中。文档数据库如Mongodb,Redis,CouchDB将数据集作为个体对象存储。IndexedDB是一个文档数据库,它在完全内置于浏览器中的一个沙盒环境中(强制依照(浏览器)同源策略)。如下图所示,展示了数据库的结构:

关于Indexeddb的增删该查,可以使用这篇文字封装的插件进行使用。

http://www.codemag.com/Article/1411041

index.db.js

复制代码
//index.db.js
;

window.indexedDB = window.indexedDB ||
window.mozIndexedDB ||
window.webkitIndexedDB ||
window.msIndexedDB;

window.IDBTransaction = window.IDBTransaction ||
window.webkitIDBTransaction ||
window.msIDBTransaction;

window.IDBKeyRange = window.IDBKeyRange ||
window.webkitIDBKeyRange ||
window.msIDBKeyRange;

(function (window) {

'use strict';

var db = {

    version: 1, // important: only use whole numbers!

    objectStoreName: 'tasks',

    instance: {},

    upgrade: function (e) {

        var
            _db = e.target.result,
            names = _db.objectStoreNames,
            name = db.objectStoreName;

        if (!names.contains(name)) {

            _db.createObjectStore(
                name,
                {
                    keyPath: 'id',
                    autoIncrement: true
                });
        }
    },

    errorHandler: function (error) {
        window.alert('error: ' + error.target.code);
        debugger;
    },

    open: function (callback) {

        var request = window.indexedDB.open(
            db.objectStoreName, db.version);

        request.onerror = db.errorHandler;

        request.onupgradeneeded = db.upgrade;

        request.onsuccess = function (e) {

            db.instance = request.result;

            db.instance.onerror =
                db.errorHandler;

            callback();
        };
    },

    getObjectStore: function (mode) {

        var txn, store;

        mode = mode || 'readonly';

        txn = db.instance.transaction(
            [db.objectStoreName], mode);

        store = txn.objectStore(
            db.objectStoreName);

        return store;
    },

    save: function (data, callback) {

        db.open(function () {

            var store, request,
                mode = 'readwrite';

            store = db.getObjectStore(mode),

            request = data.id ?
                store.put(data) :
                store.add(data);

            request.onsuccess = callback;
        });
    },

    getAll: function (callback) {

        db.open(function () {

            var
                store = db.getObjectStore(),
                cursor = store.openCursor(),
                data = [];

            cursor.onsuccess = function (e) {

                var result = e.target.result;

                if (result &&
                    result !== null) {

                    data.push(result.value);
                    result.continue();

                } else {

                    callback(data);
                }
            };

        });
    },

    get: function (id, callback) {

        id = parseInt(id);

        db.open(function () {

            var
                store = db.getObjectStore(),
                request = store.get(id);

            request.onsuccess = function (e) {
                callback(e.target.result);
            };
        });
    },

    'delete': function (id, callback) {

        id = parseInt(id);

        db.open(function () {

            var
                mode = 'readwrite',
                store, request;

            store = db.getObjectStore(mode);

            request = store.delete(id);

            request.onsuccess = callback;
        });
    },

    deleteAll: function (callback) {

        db.open(function () {

            var mode, store, request;

            mode = 'readwrite';
            store = db.getObjectStore(mode);
            request = store.clear();

            request.onsuccess = callback;
        });

    }
};

window.app = window.app || {};
window.app.db = db;

}(window));
复制代码
index.db.js使用
设置数据库名称

    //indexed db name
    app.db.objectStoreName = "mytestdb";

添加数据

    //add data
    app.db.save({ id: 2, name: "wolfy" }, function () {
        //回调函数
        console.log("添加成功");
    });

查询数据

根据id查询

    //查询
    app.db.get(1, function (item) {
        console.log(item);
    });

查询所有

    //query all
    app.db.getAll(function (items) {
        console.log(items);
    });

结果

删除数据

删除id为2的数据

    //delete 
    app.db.delete(2, function () {
        console.log('删除成功');
    })

删除所有

    app.db.deleteAll(function () {
        console.log("删除成功");
    })

修改

    //add data
    app.db.save({ id: 2, name: "wolfy2" }, function () {
        //回调函数
        console.log("添加成功");
    });

总结
在优化移动端h5页面的时候,对不经常变化的数据进行本地存储,在访问页面的时候先加载本地的然后异步更新本地数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IndexedDB浏览器提供的本地数据库,可以在浏览器中存储结构化数据。下面是 IndexedDB 的基本使用方法: 1. 打开数据库 使用 `indexedDB` 对象的 `open()` 方法打开数据库,如下所示: ``` let request = indexedDB.open('myDB', 1); ``` 其中,第一个参数是数据库名称,第二个参数是数据库版本号。如果数据库不存在,则会创建一个新的数据库。 2. 创建对象仓库 在成功打开数据库的回调方法 `request.onsuccess` 中,可以获取到数据库对象 `event.target.result`,然后使用它的 `createObjectStore()` 方法创建一个对象仓库(即数据表),如下所示: ``` let db = event.target.result; let objectStore = db.createObjectStore('people', { keyPath: 'id' }); ``` 其中,第一个参数是对象仓库的名称,第二个参数是一个对象,包含一个 keyPath 属性和其他可选属性。keyPath 用来指定数据表中的主键。 3. 添加数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `add()` 方法向数据表中添加数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.add({ id: 1, name: 'John Doe' }); ``` 其中,第一个参数是一个数组,包含要访问的对象仓库的名称,第二个参数是事务类型,可以是 'readonly' 或 'readwrite'。`add()` 方法的参数是要添加的数据。 4. 查询数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `get()` 方法查询数据,如下所示: ``` let transaction = db.transaction(['people']); let objectStore = transaction.objectStore('people'); let request = objectStore.get(1); request.onsuccess = function(event) { console.log('Name: ' + event.target.result.name); }; ``` `get()` 方法的参数是要查询的数据的主键值。查询结果保存在 `request.onsuccess` 回调方法中的 `event.target.result` 中。 5. 更新数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `put()` 方法更新数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.put({ id: 1, name: 'Jane Doe' }); ``` `put()` 方法的参数是要更新的数据。 6. 删除数据 使用事务 `db.transaction()` 开启一个事务,然后使用 `delete()` 方法删除数据,如下所示: ``` let transaction = db.transaction(['people'], 'readwrite'); let objectStore = transaction.objectStore('people'); let request = objectStore.delete(1); ``` `delete()` 方法的参数是要删除的数据的主键值。 以上就是 IndexedDB 的基本使用方法。需要注意的是,IndexedDB 的 API 非常庞大,不仅仅包含上面提到的这些方法,还包括索引、游标、版本升级等功能。如果需要更详细的介绍和示例代码,可以参考 MDN 的文档:https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值