/**
* <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) => {
}
});
})($);
indexedDB 简单数据库操作封装
最新推荐文章于 2024-07-19 09:27:23 发布