html5 indexDB的使用

angular.module('indexdb', [])
    .factory('indexDbJs', [function() {
        const CurDBVersion = 10000;

        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;
        window.IDBCursor = window.IDBCursor || window.webkitIDBCursor || window.msIDBCursor;
        var db = {
            dbName: 'macImDb',
            obj: {},
            dbInstance: {},
            errorHandler: function(error) {
                // console.log('error: ' + error.target.error.message);
            },
            // 打开数据库,没有则自动创建
            open: function(func, fail) {
                // var version = db.getdbVeision();
                if(db.dbName.indexOf('_')<0) {
                    console.error(db.dbName);
                    debugger;
                }
                var dbContent = window.indexedDB.open(db.dbName);
                // dbContent.onupgradeneeded = db.upgrade;
                // dbContent.onerror = db.errorHandler;
                dbContent.onsuccess = function(e) {
                    // console.log('打开成功');
                    var _db = e.target.result;
                    db.dbInstance = dbContent.result;
                    db.dbInstance.onerror = function() {

                    };
                    func();
                    _db.close();

                };
                dbContent.onerror = function(e) {
                    var _db = e.target.result;
                    // console.log('打开不成功');
                    _db.close();
                };
                dbContent.onupgradeneeded = function(e) {
                    // console.log('更新');
                    var _db = e.target.result;
                    _db.close();
                };
                dbContent.onblocked = (e)=>{
                  console.log("onblocked");
                };

            },
            // 关闭数据库
            closeDB: function(db) {
                db.close();
            },
            // 创建数据表
            createStore: function(storeInfo, indexInfo, callback) {
                var count = 0;
                db.obj.stname = storeInfo.stname;
                db.obj.indexInfo = indexInfo;
                //创建数据库
                //var version = db.getdbVeision() + 1;
                // console.log(version);
                // var req = window.indexedDB.open(db.dbName);
                // req.onsuccess = function(e) {
                // var version = e.target.result.version;
                var dbContent = window.indexedDB.open(db.dbName, CurDBVersion);
                // 判断数据库版本号是否更新``
                // dbContent.onupgradeneeded = db.upgrade;
                dbContent.onupgradeneeded = function(e) {
                    // console.log('更新了');
                    var _db = e.target.result,
                        names = _db.objectStoreNames;
                    // 此处可以创建多个表

                    // var name = db.obj.stname;
                    var name = storeInfo.stname;
                    if (!names.contains(name)) {
                        // console.log('chuagnjian');
                        var store = _db.createObjectStore(
                            db.obj.stname, {
                                keyPath: 'id',
                                autoIncrement: true
                            });
                        // 如果创建数据表时传过来的索引信息不为空则创建索引
                        if (db.obj.indexInfo && db.obj.indexInfo.length !== 0) {
                            for (var i = 0; i < db.obj.indexInfo.length; i++) {
                                var req = store.createIndex(db.obj.indexInfo[i].indexName, db.obj.indexInfo[i].index, { unique: false });
                                req.onsuccess = function() {
                                    count++;
                                    if (count >= indexInfo.length) {
                                        callback(true);
                                        _db.close();
                                    }
                                };

                            }
                        } else {
                            callback(true);
                            _db.close();
                        }

                    } else {
                        callback(true);
                        _db.close();
                    }
                },
                    // 创建数据库成功事件
                    dbContent.onsuccess = function(e) {
                        var _db = e.target.result;
                        // console.log('创建成功');
                        db.dbInstance = dbContent.result;
                        callback(true);
                        _db.close();
                    },
                    // 创建数据库成功事件
                    dbContent.onerror = function() {
                        // var _db = e.target.result;
                        // console.log('创建失败');
                        // callback(false);
                        // _db.close();
                        // console.log(333);
                    };
                    // }

            },
            /**
             * 设置数据库名称
             * @param dbname 数据库名称
             */
            setDbName: function(dbname){
                db.dbName = dbname;
            },
            /**
             * 创建数据库和表
             * @param storeInfo 表
             * @param indexInfo 索引
             * @param callback 回调
             * @constructor
             */
            CreateStores: function(storeInfo, indexInfo, callback) {
                // db.obj.stname = storeInfo.stname;
                db.obj.indexInfo = indexInfo;
                var count = 0;
                //创建数据库
                //var version = db.getdbVeision();
                // console.log(version);
                // var req = window.indexedDB.open(db.dbName);
                // req.onsuccess = function(e) {
                // var version = e.target.result.version;
                var dbContent = window.indexedDB.open(db.dbName, CurDBVersion);
                // console.log(dbContent.getVesdion)
                // 判断数据库版本号是否更新``
                // dbContent.onupgradeneeded = db.upgrade;
                dbContent.onupgradeneeded = function(e) {
                    // console.log('更新了');
                    var _db = e.target.result,
                        names = _db.objectStoreNames;
                    // 此处可以创建多个表
                    // var arr = ['dtt1', 'dttt2', 'dttt3'];
                    for (var i = 0; i < storeInfo.length; i++) {
                        var name = storeInfo[i].stname;
                        if (!names.contains(name)) {
                            var store = _db.createObjectStore(
                                name, {
                                    keyPath: 'id',
                                    autoIncrement: true
                                });
                            // 如果创建数据表时传过来的索引信息不为空则创建索引
                            if (db.obj.indexInfo[i] && db.obj.indexInfo[i].length !== 0) {
                                for (var j = 0; j < db.obj.indexInfo[i].length; j++) {
                                    store.createIndex(db.obj.indexInfo[i][j].indexName, db.obj.indexInfo[i][j].index, { unique: false });
                                }
                                count++;

                            }

                        } else {
                            // callback(true);
                            // db.closeDB('macImDb');

                            //检测是否有索引更新的
                            var store = dbContent.transaction.objectStore(name);
                            for (var j = 0; j < db.obj.indexInfo[i].length; j++) {
                                if (!store.indexNames.contains(db.obj.indexInfo[i][j].indexName))
                                {
                                    store.createIndex(db.obj.indexInfo[i][j].indexName, db.obj.indexInfo[i][j].index, {unique: false});
                                }
                            }

                        }
                    }
                    if (count >= storeInfo.length) {
                        callback(true);
                    }


                    },
                    // 创建数据库成功事件
                    dbContent.onsuccess = function(e) {
                        db.dbInstance = dbContent.result;
                        callback(true);

                        // db.closeDB('macImDb');
                        // db.dbInstance.onerror = null;
                        // console.log(db);
                    },
                    // 创建数据库失败事件
                    dbContent.onerror = function() {
                        callback(false);

                    };
                    // }


            },
            // 获得数据表
            getObjectStore: function(objectStoreName, mode) {
                var txn, store;
                mode = mode || 'readonly';
                txn = db.dbInstance.transaction([objectStoreName], mode);

                store = txn.objectStore(objectStoreName);
                return store;
            },
            // 当数据库版本更新时创建数据表
            upgrade: function(e) {
                // console.log('更新了');
                var _db = e.target.result,
                    names = _db.objectStoreNames;
                // 此处可以创建多个表
                var name = db.obj.stname;
                // console.log(db.obj.stname);
                // console.log(name);
                if (!names.contains(name)) {
                    var store = _db.createObjectStore(
                        db.obj.stname, {
                            keyPath: 'id',
                            autoIncrement: true
                        });
                    // 如果创建数据表时传过来的索引信息不为空则创建索引
                    if (db.obj.indexInfo && db.obj.indexInfo.length !== 0) {
                        for (var i = 0; i < db.obj.indexInfo.length; i++) {
                            store.createIndex(db.obj.indexInfo[i].indexName, db.obj.indexInfo[i].index, { unique: false });
                        }
                    }

                }
            },
            // 添加数据(不负责创建表)
            addStore: function(objectStoreName, data, callback) {
                // 如果此处是数组在此函数内部循环,而不是循环调用add函数是否会快点。
                        db.open(function() {
                            var store, req, mode = 'readwrite';
                            var addNum = 0;
                            store = db.getObjectStore(objectStoreName, mode);
                            for (var i = 0; i < data.length; i++) {
                                var req = store.add(data[i]);
                                req.onsuccess = function() {
                                    addNum++;
                                    if (addNum >= data.length) {
                                        callback(true);
                                    }
                                };
                                req.onerror = function() {
                                    callback(false);
                                };
                            }
                            //     req = store.add(data);
                            // req.onsuccess = function() {
                            //     console.log('add');
                            // };
                            // req.onerror = fail;
                        });

            },
            //  添加数据(发现没有表则创建表)
            add: function(type, userId, objectStoreName, indexInfo, data, callback) {
                // console.log(objectStoreName);
                // console.log(data);
                if (type !== null) {
                    objectStoreName = type + userId;
                }
                // console.log('add');
                // indexDbJs.createStore({ stname: 'dt1' }, [], function(data) {
                //     console.log(data);
                // })
                db.createStore({ stname: objectStoreName }, indexInfo, function(result) {
                    if (result === true) {
                        // console.log(true);
                        // 如果此处是数组在此函数内部循环,而不是循环调用add函数是否会快点。
                        db.open(function() {
                            var store, req, mode = 'readwrite';
                            var addNum = 0;
                            store = db.getObjectStore(objectStoreName, mode);
                            for (var i = 0; i < data.length; i++) {
                                var req = store.add(data[i]);
                                req.onsuccess = function() {
                                    addNum++;
                                    if (addNum >= data.length) {
                                        callback(true);
                                    }
                                };
                                req.onerror = function() {
                                    callback(false);
                                };

                            }
                        });
                    }
                });
            },
            //更新数据表
            update: function(objectStoreName, data, callback) {
                db.open(function() {
                    var store, req, mode = 'readwrite';
                    var updateNum = 0;
                    store = db.getObjectStore(objectStoreName, mode);
                    if (data.length == 0) {
                        if (callback) {
                            callback(true);
                        }
                    }
                    for (var i = 0; i < data.length; i++) {
                        var req = store.put(data[i]);
                        req.onsuccess = function() {
                                updateNum++;
                                if (updateNum >= data.length) {
                                    if (callback) {
                                        callback(true);
                                    }
                                }
                            },
                            req.onerror = function() {
                                if (callback) {
                                    callback(true);
                                }
                            };
                    };

                });
            },
            // 通过id查找数据(不加游标)
            selectDataById: function(objectStoreName, id, callback) {
                db.open(function() {
                    var store = db.getObjectStore(objectStoreName),
                        req = store.get(id);
                    req.onsuccess = function(e) {
                        if (!e.target.result) {
                            return callback(null);
                        }
                        callback(e.target.result);
                    };
                    req.onerror = function() {
                        callback(false);
                    };
                });

            },
            // 通过自己创建的索引查找数据(不加游标)
            selectSingleDataByIndex: function(objectStoreName, indexName, data, callback) {
                db.open(function() {
                    var store = db.getObjectStore(objectStoreName);
                    var index = store.index(indexName);
                    var result = [];
                    var count = 0
                    for (var i = 0; i < data.length; i++) {
                        // count++;
                        index.get(data[i]).onsuccess = function(e) {

                            count++;
                            if (e.target.result) {
                                result.push(e.target.result);
                            }

                            if (count >= data.length) {
                                callback(result);
                            }
                        }
                    }
                });

            },
            //  通过自己创建的索引查找数据(增加游标)
            // selectDataByIndex: function(objectStoreName, indexName, searchData, callback) {
            //     db.open(function() {
            //         var store = db.getObjectStore(objectStoreName);
            //         var index = store.index(indexName);
            //         var data = [];
            //         var request = index.openCursor(IDBKeyRange.only(searchData))
            //         request.onsuccess = function(e) {
            //             var cursor = e.target.result;
            //             if (cursor) {
            //                 var result = cursor.value;
            //                 data.push(result);
            //                 // console.log(data);
            //                 if(result&&result!==null){

            //                    cursor.continue();
            //                  }else{

            //                  }
            //                 // console.log(result);
            //             }else {
            //                 callback(data);
            //             }
            //         },
            //         request.onerror = callback(false);

            //     });

            // },
            // 通过自己创建的索引查找数据(增加游标)
            selectDataByIndex: function(objectStoreName, indexName, searchData, callback) {
                    console.log('查询数据,通过自己的索引');
                db.open(function() {
                     console.log('查询数据库');
                    var store = db.getObjectStore(objectStoreName);
                    var index = store.index(indexName);
                    var data = [];
                     console.log(searchData);
                    var cursor = index.openCursor(IDBKeyRange.only(searchData));
                    cursor.onsuccess = function(e) {
                            if (e.target.result) {
                                var result = e.target.result.value;
                                // var result = result.value;
                                // console.log(result);
                                data.push(result);
                                // console.log(data);
                                if (result && result !== null) {
                                    e.target.result.continue();
                                } else {
                                     console.log(result);
                                }
                                // console.log(result);
                            } else {
                                callback(data);
                            }
                        },
                        cursor.onerror = function() {
                            callback(false);
                        };

                });

            },
            // 根据索引删除数据
            deleteDataByIndex: function(objectStoreName, indexName, searchData, callback) {
                 console.log('查询数据');
                db.open(function() {
                     console.log('查询数据库');
                    var store = db.getObjectStore(objectStoreName, 'readwrite');
                    var index = store.index(indexName);
                    var data = [];
                    var cursor = index.openCursor(IDBKeyRange.only(searchData));
                    cursor.onsuccess = function(e) {
                            if (e.target.result) {
                                var result = e.target.result.value;
                                // var result = result.value;
                                 console.log(result);
                                store.delete(result.id);
                                // console.log(data);
                                if (result && result !== null) {
                                    e.target.result.continue();
                                } else {

                                }
                                // console.log(result);
                            } else {
                                if(callback){
                                  callback(true);
                                }

                            }
                        },
                        cursor.onerror = function() {
                            callback(false);
                        };

                });

            },
            deleteDataById: function(objectStoreName, id, callback) {
                db.open(function() {
                    var
                        mode = 'readwrite',
                        store, req;
                    store = db.getObjectStore(objectStoreName, mode);
                    // console.log('要删除的id'+id);
                    // console.log(typeof id);
                    req = store.delete(id);
                    req.onsuccess = function(){
                        // console.log('删除ok');
                        callback(true);
                    };
                    req.onerror = function(){
                        callback(false);
                    };
                });

            },


            // 根据id范围获取数据
            selectDataByIdRange: function(objectStoreName, indexName, startId, endId, callback) {
                db.open(function() {
                    var store = db.getObjectStore(objectStoreName);
                    var index = store.index(indexName);
                    var boundKeyRange = IDBKeyRange.bound(startId, endId, false, true);
                    var data = [];
                    // req = store.get(id);
                    index.openCursor(boundKeyRange).onsuccess = function(event) {
                        var cursor = event.target.result;
                        if (cursor) {
                            // Do something with the matches.
                            // console.log(cursor.value);
                            data.push(cursor.value);
                            cursor.continue();
                        } else {
                            callback(data);
                        }

                    }
                });
            },
            // 获得一个数据表的所有数据
            selectAll: function(objectStoreName, callback) {

                db.open(function() {
                    var
                        store = db.getObjectStore(objectStoreName),
                        cursor = store.openCursor(),
                        data = [];

                    cursor.onsuccess = function(e) {
                        var result = e.target.result;
                        if (result && result !== null) {
                            data.push(result.value);
                            result.continue();
                            // callback(data);
                        } else {

                            callback(data);

                        }

                    };
                    cursor.onerror = function() {
                        callback(false);
                    };

                });
            },
            // 清空某个数据表
            // deleteAllDate: function(dbName,objectStoreName) {
            //   var version=db.getdbVeision()
            //   db.open(dbName);
            // },
            // 删除某个数据表
            // deleteStore: function(objectStoreName) {
            //     db.open(function() {
            //         // if (db.objectStoreNames.contains(objectStoreName)) {
            //         db.deleteObjectStore(objectStoreName);
            //         // }
            //     });

            // },
            deleteAllStore: function(objectStoreName, success, fail) {

            },
            // 删除某个数据库
            deleteDB: function(dbName) {
                indexedDB.deleteDatabase(dbName);
            },
            // 获得数据库当前版本
            getdbVeision: function() {
                var dbVersion = parseInt(localStorage.getItem("dbVersion")) || 1;
                dbVersion++;
                localStorage.setItem("dbVersion", dbVersion);
                return dbVersion;
                // return +new Date();
            }
        };
        return db;
    }]);
原文地址:https://www.cnblogs.com/sxz2008/p/6639030.html