IndexedDB 增删改查 简单的库

<!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))

  

你可能感兴趣的:(index)