indexedDB

创建数据库


/**
 *
 * 创建数据库
 * @param name
 * @param version
 */
function openDB(name, version, datas, done) {
    var version = version || 1;
    var request = {};
    var isException = false;
    try {
        request = window.indexedDB.open(name, version);
    } catch (e) {
        isException = true;
        console.log('打开本地IndexDB' + name + '失败, ' + e.message);
    }
    if (isException) {
        return;
    }

    request.onupgradeneeded = function (e) {
        var db = e.target.result;
        if (!db.objectStoreNames.contains(myDB.table)) {
            //自定义主键
            db.createObjectStore(myDB.table, {keyPath: "signTime"});
            //不建议使用,是自动生成主键id,重复数据会继续增长
            //db.createObjectStore(myDB.table,{autoIncrement: true});
        }
        console.log(myDB.table + ", 数据库创建表成功");
    };

    request.onsuccess = function (e) {
        myDB.db = e.target.result;
        console.log(name + ", 打开数据库成功");
        addData(myDB.db, myDB.table, datas, done);
    };

    request.onerror = function (e) {
        console.log(name + ", 打开数据或创建数据库错误" + e.currentTarget.error.message);
        done(e);
    };

}

添加数据

/**
 * 往数据库表中添加数据
 * @param db
 * @param storeName
 * @param datas
 */
function addData(db, storeName, datas, done) {
    if (db.objectStoreNames.length === 0) {
        console.log(db.name + ', 数据库表未建立');
        //删除数据库重新建立
        window.indexedDB.deleteDatabase(db.name);
        return;
    }

    var store = {};
    var transaction = {};
    var isException = false;
    try {
        //需先创建事务,并访问事务中的objectStore
        transaction = db.transaction(storeName, 'readwrite');
        store = transaction.objectStore(storeName);
    } catch (e) {
        isException = true;
        console.log('本地缓存数据失败, ' + e.message);
    }
    if (isException) {
        return;
    }
    start_time = new Date().getTime();
    for (var i = 0; i < datas.length; i++) {
        //保存数据 使用add()方法,遇到键值相同的对象会返回错误,而put()则不会报错,会重写原有对象
        var request = store.add(datas[i]);
        request.onerror = function () {
            console.log(db.name + ', 数据库中已有该数据');
            // done();
        };
        request.onsuccess = function () {
            console.log(db.name + ', 数据存储请求发起完毕');
            // done();
        };
    }

    transaction.oncomplete = function() {
        console.log(db.name + ', 保存数据事务提交完毕');
        done();
    };
    transaction.onerror = function() {
        console.log(db.name + ', 打开事务出错');
        done();
    };
}

取出全部数据

/**
 * 通过游标遍历数据库的全部数据
 * @param db
 * @param storeName
 */
function fetchStoreByCursor(db, storeName, done) {
    end_time = new Date().getTime();
    var sendArr = [];
    if (db.objectStoreNames.length === 0) {
        console.log(db.name + ', 数据库表未建立');
        return;
    }
    try {
        db.transaction(storeName).objectStore(storeName).openCursor().onsuccess = function (event) {
            var cursor = event.target.result;
            if (cursor) {
                var record = cursor.value;
                record.by1 = end_time - start_time;
                sendArr.push(cursor.value);
                cursor.continue();
            } else {
                done(sendArr);
            }
        }
    } catch(e) {
        console.log(db.name + ', 读取数据失败!' + ', ' + e.message);
    }

}

后台发送数据

/**
 * 向后台发送数据
 * @param types 剩余要处理的数据类型
 * @param type 正在处理的数据类型
 * @param url 后台请求的地址
 * @param datas 要发送的数据
 */
function postData(types, type, url, datas) {
    console.log(type + ", 开始发送数据");
    if (datas.length === 0) {
        console.log(type + ', 没有数据待发送');
        if (types.length > 0) {
            sendRecordData(types, url);
        }
        return;
    }
    $.ajax({
        type: "POST",
        url: url,
        data: {sendArrJson: JSON.stringify(datas), type: type},
        success: function (e) {
            var ret = eval("(" + e + ")");
            if (ret.type) {
                console.log(type + ', 本地数据上传完毕');
                console.log(type + ', 开始清除本地缓存');
                clearData(ret.type + '', function (success) {
                    if(success !== 1) {
                        console.log(type + ', 清除本地缓存失败');
                        if (types.length > 0) {
                            sendRecordData(types, url);
                        }
                        return;
                    }
                    console.log(type + ', 清除本地缓存成功');
                    if ('1' !== type) {
                        sendRecordData(types, url);
                        return;
                    }

                    var saveDatas = [];
                    for (var i in datas) {
                        var data = datas[i];
                        var keyAms = data.keyAm.split('@@');
                        //不再保存拔出信息
                        if (keyAms.length < 5 || keyAms[4] === '2') {
                            continue;
                        }
                        saveDatas.push(data);
                    }
                    saveDataToIndexDB(type, saveDatas, function () {
                        console.log('本地缓存在线数据完毕!');
                        if (types.length > 0) {
                            sendRecordData(types, url);
                        }
                    });
                });
            }
        },
        failure: function() {
            console.log('发送数据失败');
            if (types.length > 0) {
                sendRecordData(types, url);
            }
        },
        error: function() {
            console.log('发送数据失败');
            if (types.length > 0) {
                sendRecordData(types, url);
            }
        }
    });
}

清除数据

/**
 * 清除数据
 */
function clearData(type, done) {

    console.log(type + ', 准备删除数据');
    var DBName = '';
    var tableName = 'record';
    var isException = false;
    var DBOpenRequest = {};
    try {
        DBOpenRequest = window.indexedDB.open(DBName);
    } catch(e) {
        clearDataErrorFun(DBName, done, e);
        isException = true;
    }
    if (isException) {
        return;
    }
    var transaction = {};
    DBOpenRequest.onsuccess = function() {
        var db = DBOpenRequest.result;
        if (!db.objectStoreNames.contains(tableName)) {
            console.log(DBName + ', 没有待删除的数据');
            if (done) {
                done(1);
            }
            return;
        }
        try {
            transaction = db.transaction(tableName, 'readwrite');
        } catch(e) {
            clearDataErrorFun(DBName, done, e);
            isException = true;
        }
        if (isException) {
            return;
        }
        var objectStore = transaction.objectStore(tableName);
        transaction.oncomplete = function() {
            console.log(DBName + ', 数据删除事务提交');
            if (done) {
                done(1);
            }
        };
        var objectStoreRequest = objectStore.clear();
        objectStoreRequest.onsuccess = function() {
            console.log(DBName + ', 数据删除请求');
        };
        objectStoreRequest.onerror = function() {
            clearDataErrorFun(DBName, done);
        };
    };
    DBOpenRequest.onerror = function() {
        clearDataErrorFun(DBName, done);
    };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值