zoukankan      html  css  js  c++  java
  • 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))
    

      

  • 相关阅读:
    PHP使用iconv函数遍历数组转换字符集
    ping localhost出现地址::1
    在 Windows 7 中禁用IPv6协议/IPv6隧道
    ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决
    [LeetCode] Climbing Stairs
    [LeetCode] Binary Tree Level Order Traversal II
    [LeetCode] Set Mismatch
    [LeetCode] Power of Four
    [LeetCode] Power of Three
    [LeetCode] Power of Two
  • 原文地址:https://www.cnblogs.com/Mr-Joe/p/3421344.html
Copyright © 2011-2022 走看看