indexedDB 简单数据库操作封装

/**
 * <pre>
 *  indexedDB 简单数据库操作封装  拓展jquery对象方法
 *    indexedDB 连接级别:页签是否关闭
 *    存储级别:物理磁盘永久
 *    async:true
 * </pre>
 * @author qhs
 * @date 2019/09/17 14:57:45
 * @version 1.0
 */
//闭包  以形参解决 $ 对象
;(function ($) {
    //全局db 请求连接 操作参数
    let db;
    //全局默认参数
    let default_opts = {
        //数据库名
        databaseName: "shopping",
        //数据库版本 第一次初始化建立所有结构,不做版本操作
        version: 1,
        //调试模式 开启console.log输出
        debug: true,
        //数据仓库|表 初始化配置
        objectStoreConfigs: [{
            data_name: 'dictionary',
            //当前表主键设置
            key_opts: {keyPath: 'id'}
        }
        ]
    };
    //局部默认参数
    let default_datas = {
        success: () => {
        }
    };

    //loading... init db connect
    init(() => {
    });

    /**
     * 数据库结构初始化
     * @param dbc
     */
    function createObjectWarehouse(dbc) {
        $.info('{msg: objectStore  init start.......}');
        $.each(default_opts.objectStoreConfigs, (i, config) => {
            //去重
            if (!dbc.objectStoreNames.contains(config.data_name)) {
                //create object warehouse
                var objectStore = dbc.createObjectStore(config.data_name, config.key_opts);
                if (!objectStore) {
                    $.err('indexDb {} createObjectWarehouse failed', config.data_name);
                } else $.info('{msg:objectStore {} create success}', config.data_name);
            } else {
                $.err('indexDb createObjectWarehouse error objectWarehouse name [' + config.data_name + '] already exist');
            }
        });
        $.info('{msg: objectStore init end}');
    }

    /**
     * indexed Db init
     * @param success
     */
    function init(success) {
        // y|n 支持
        var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
        // change browser vesion
        if (!indexedDB) {
            alert("您当前浏览器不支持IndexedDB,请切换主流浏览器尝试!")
        }
        //连接请求
        var request = indexedDB.open(default_opts.databaseName, default_opts.version);
        /**
         * error callback
         * @param event
         */
        request.onerror = event => {
            $.err('indexedDb open error. err_msg:[{}]', event.currentTarget.error.message);
        };
        /**
         * open or create sucess callback
         * @param event
         */
        request.onsuccess = event => {
            db = db ? db : event.target.result;
            $.info('{msg:indexedDB database:{name:{},version:{}}  open success.}', default_opts.databaseName, default_opts.version);
            success(db);
        };
        /**
         * 第一次 打开成功后或者版本有变化自动执行以下事件,一般用于初始化数据库
         *  注:唯一可以改变数据库结构的地方
         * @param event
         */
        request.onupgradeneeded = event => {
            createObjectWarehouse(event.target.result);
            $.info('{msg:indexedDB database:{name:{},version:{}}  init success.}', default_opts.databaseName, default_opts.version);

        }
    }


    /**
     * 操作 单行数据 crud
     * @param db
     * @param data
     */
    function operation(db, data) {
        //数据库连接 事务操作
        var request = db.transaction([$.idb_dataName(data.data_name)], 'readwrite').objectStore($.idb_dataName(data.data_name));
        //crud celan
        switch (data.operation) {
            case 'c':
                request = request.add(data.data);
                break;
            case 'r':
                request = request.get(data.data);
                break;
            case 'u':
                request = request.put(data.data);
                break;
            case 'd':
                request = request.delete(data.data);
                break;
            case 'clean':
                request = request.clear();

        }
        //success
        request.onsuccess = event => {
            $.info('{msg:"indexedDb  {} operation  success."}', data.operation);
            data.success(request.result);
        };
        //error
        request.onerror = event => {
            // $.err('{msg:"indexedDb  {} operation  error.",data:{error_msg:"{}",default_opts:{},data:{}}}', data.operation, event.currentTarget.error.message, default_opts, data);
            $.err('{msg:"indexedDb  {} operation  error.",data:{error_msg:"{}",key:{}}}', data.operation, event.currentTarget.error.message, data.data.id);
        }
    }

    /**
     * 初始化 db 及 参数
     * @param data
     * @param opts
     * @param type 操作类型
     */
    function initDbAndParameters(data, opts, type) {
        //init default 参数 处理
        default_opts = $.extend(true, {}, default_opts, opts);
        //参数默认值 深度合并(即对对象中对象处理)操作,default_opts,data 对象属性,合并在{},default_datas与data属性名重复时 data 覆盖 default_datas
        data = $.extend(true, {}, default_datas, data,);
        //crud 类型
        data.operation = type;
        //连接是/否存在 是/否async 回调
        db ? operation(db, data) : init(db => operation(db, data));
    }

    //拓展 jquery indexedDB  crud,clean
    $.extend({
        /**
         * get dataName
         */
        idb_dataName: (i) => {
            return default_opts.objectStoreConfigs[i ? i : 0].data_name;
        },
        /**
         * idb_create
         * @param data /{data:{id:行数据主键,info:{}},data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}/
         * @param opts look idb_parametricDescription method
         */
        idb_create: (data, opts) => initDbAndParameters(data, opts, "c"),
        /**
         * idb_read
         * @param data /{data:行数据主键,success(results)},data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}/
         * @param opts look idb_parametricDescription method
         */
        idb_read: (data, opts) => initDbAndParameters(data, opts, "r"),
        /**
         * idb_update
         * @param data /{data:{id:行数据主键,info:{}},data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}/
         * @param opts look idb_parametricDescription method
         */
        idb_update: (data, opts) => initDbAndParameters(data, opts, "u"),
        /**
         * idb_delete
         * @param data /{data:行数据主键,data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}}/
         * @param opts look idb_parametricDescription method
         */
        idb_delete: (data, opts) => initDbAndParameters(data, opts, "d"),
        /**
         *  idb_clean
         * @param data /{success:success,data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}/
         * @param opts default
         */
        idb_clean: (data, opts) => initDbAndParameters(data, opts, "clean"),
        /**
         * 参数描述
         * @param data 局部参数 /{data:{},success: success,data_name:(操作数据仓库名|表名) objectStoreConfigs 中 序号}/
         * @param opts 全局参数 /{databaseName: string, version: number, objectStoreConfigs:[data_name: string, key: {keyPath: string}]}/
         */
        idb_parametricDescription: (data, opts) => {
        }
    });

})($);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值