<!DOCTYPE html> <html> <head> <title></title> <script src="IndexedDb.js"></script> <script> //初始化数据库 //1.新建数据库 //2.新建表 //3.创建数据表对应的Data Model var dbInfo = []; //新建数据库的信息 var dbversion = 2; var dbname = 'newdb'; var tables = {//表名字的枚举值 cost: 'Cost', user: 'User', catgory: 'Catgory' } var costTable = {//消费表 name: tables.cost, //表名字 fields: ['catgory', 'cost', 'date', 'description'],//字段 index: [//索引 {key: 'date', unique: true} //索引键名,是否唯一 ] } var catgoryTable = {//类别表 name: tables.catgory, fields: ['catgory'], index: [//索引 {key: 'catgory', unique: true} ] } var userTable = {//用户表 name: tables.user, fields: ['phone', 'pwd', 'uid', 'uname'], index: [//索引 {key: 'uid', unique: true}, {key: 'uname', unique: true} ] } dbInfo.push(costTable); dbInfo.push(catgoryTable); dbInfo.push(userTable); Index.create(dbname, dbInfo, null, null, dbversion); //初始化数据库完毕 //Data Model 的 增删改查方法 window.onload = function () { //实例化一个对象 var user = new User({uname: 'joe0.453569732606411'}); //添加一条数据 user.add({}, function (data) { if (data == 'complete') { console.log('add success;'); //do something you want } }); //更新一条数据 user.update({uid: 123}, function (data) { if (data == 'success') { console.log('update success;'); //do something you want } else { //not find this item to uopdate } }); //获取数据表的所有数据 user.get(function (data) { console.log('get success'); data.forEach(function (item) { var div = document.createElement('div'); div.innerText = item.uname + ':' + item.uid; document.body.appendChild(div); }) }); //删除一条数据 user.delete(function (data) { if (data == 'success') { console.log('delete success;'); //do something you want } else { //not get this item to delete } }) } </script> </head> <body> </body> </html>
下面是IndexedDb.js
/** * Created by 宇乔 on 13-11-12. */ (function (window) { var A = { create: function (dbname, dbInfo, successFn, errorFn, version) { var me = this; this.dbName = dbname; this.version = version; for (var i = 0, len = dbInfo.length; i < len; i++) { me.generateModel(dbInfo[i]); } this.open(dbname, version, function success(request) { if (me.isFunction(successFn)) { successFn.call(this, request); } }, function error() { if (me.isFunction(errorFn)) { errorFn.call(this); } }, function update(event) { for (var i = 0, len = dbInfo.length; i < len; i++) { var info = dbInfo[i]; var objectStore = event.currentTarget.result.createObjectStore(info.name, { keyPath: "id", autoIncrement: true }); for (var j = 0, l = info.index.length; j < l; j++) { objectStore.createIndex(info.index[j].key || 'null', info.index[j].key || 'null', { unique: info.index[j].unique || false }); } } }, dbInfo); }, open: function (dbname, version, success, error, update, dbInfo) { var me = this; 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; if (!window.indexedDB) { error.call(null); return; } var req = window.indexedDB.open(dbname, version); req.onerror = function (event) { if (me.isFunction(error)) { error.call(this, event); } }; req.onsuccess = function (event) { if (me.isFunction(success)) { success.call(this, req, event); } }; req.onupgradeneeded = function (event) { if (me.isFunction(update)) { update.call(this, event); } }; }, getIndexFields: function (index) { var indexfiled = []; index.forEach(function (item) { indexfiled.push(item['key']); }); return indexfiled; }, getIndex: function () { var fields = []; var result = {}; var indexs = this.indexFields; var that = this; for (var i in this) { if (this.hasOwnProperty(i)) { if (this[i] != 'undefined') { fields.push(i); } } } fields.forEach(function (item) { if (indexs.indexOf(item) != -1) { result['key'] = item; result['value'] = that[item]; } }); return result; }, generateModel: function (info) { var fName = info.name; var fields = info.fields; var me = this; var cons = ''; var method = ''; fields.forEach(function (item) { cons += 'this.' + item + '=data.' + item + ';'; }) var index = me.getIndexFields(info.index); cons += fName + '.prototype.version=' + this.version + ';' + fName + '.prototype.dbName="' + this.dbName + '";' + fName + '.prototype.tbName="' + fName + '";' + fName + '.prototype.indexFields="' + index + '";' + fName + '.prototype.fields="' + fields + '";'; var add = fName + '.prototype.add=' + function (data, fn) { var that = this; me.open(me.dbName, me.version, function success(req) { var db = req.result; var transaction = db.transaction(that.__proto__.tbName, "readwrite"); var itemStore = transaction.objectStore(that.__proto__.tbName); var sourceData = that.getSourceData(); if (sourceData) { data = sourceData } var request = itemStore.add(data); request.onsuccess = function (evt) { }; transaction.oncomplete = function (event) { if (me.isFunction(fn)) { fn(event.type); db.close() } }; transaction.onerror = function (event) { if (me.isFunction(fn)) { fn(event); db.close() } }; } ); }; var getSourceData = fName + '.prototype.getSourceData=' + function () { var me = this; var obj = {}; var keys = Object.keys(this); keys.forEach(function (item) { if (me.hasOwnProperty(item)) { obj[item] = me[item] } } ); return obj; }; var del = fName + '.prototype.delete=' + function (fn) { var that = this; me.open(me.dbName, me.version, function success(req) { var db = req.result; var transaction = req.result.transaction(that.__proto__.tbName, "readwrite"); var itemStore = transaction.objectStore(that.__proto__.tbName); var getSearchData = me.getIndex.call(that); var getData = itemStore.index(getSearchData.key).get(getSearchData.value); getData.onsuccess = function (data) { if (data.target.result) { var deleteFn = itemStore.delete(data.target.result.id); deleteFn.onsuccess = function (e) { if (me.isFunction(fn)) { fn(e.type); db.close(); } }; deleteFn.onerror = function (evt) { if (me.isFunction(fn)) { fn(evt); db.close(); } } } else { if (me.isFunction(fn)) { fn("not find item to delete"); db.close(); } } }; getData.onerror = function (e) { if (me.isFunction(fn)) { fn(e); db.close(); } } } ); }; var update = fName + '.prototype.update=' + function (newData, fn) { var that = this; me.open(me.dbName, me.version, function success(req) { var db = req.result; var transaction = db.transaction(that.__proto__.tbName, "readwrite"); var getSearchData = me.getIndex.call(that); var store = transaction.objectStore(that.__proto__.tbName), itemStore = store.index(getSearchData.key).get(getSearchData.value); itemStore.onsuccess = function (evt) { if (evt.target.result) { var model = evt.target.result; for (var i in newData) { model[i] = newData[i]; } store.put(model); if (me.isFunction(fn)) { fn(evt.type); } db.close(); } else { if (me.isFunction(fn)) { fn("not find this item"); db.close(); } } ; itemStore.onerror = function (evt) { if (me.isFunction(fn)) { fn(evt); } db.close(); } } } ); }; var get = fName + '.prototype.get=' + function (fn) { var that = this; me.open(me.dbName, me.version, function success(req) { var db = req.result; var transaction = req.result.transaction(that.__proto__.tbName, "readwrite"); var itemStore = transaction.objectStore(that.__proto__.tbName); var cur = itemStore.openCursor(IDBKeyRange.lowerBound(0)); var dataList = []; cur.onsuccess = function (evt) { var cursor = evt.target.result; if (cursor) { dataList.push(cursor.value); cursor.continue(); } else { if (me.isFunction(fn)) { fn(dataList); db.close(); } } }; cur.onerror = function () { if (me.isFunction(fn)) { fn("not get this item"); db.close(); } } } ); }; eval(fName + " = function (data) {" + cons + "}"); eval(add); eval(getSourceData); eval(get); eval(update); eval(del); }, isFunction: function (o) { return o && Object.prototype.toString.call(o) == '[object Function]'; }, isObject: function (o) { return o && Object.prototype.toString.call(o) == '[object Object]'; } }; window['Index'] = A; }(window))