IndexedDB 简单封装
IndexedDB 浏览器数据库,是一个非关系型数据库,数据形式使用的是json,IndexedDB适合存储大量数据,它的API是异步调用的,当然他的api 也相对复杂。
当然浏览器数据存储 还有LocalStorage,Cookies,web SQL等 为什么还再来一个indexedDB。
之前我在开发过程中使用的是web sql,可以直接写sql查询数据。
LocalStorage,用key-value键值模式存储数据,而且Localstorage就是专门为小数量数据设计的。
Cookies只能是字符串 而且空间有限。
如果你在实际应用中希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB也能提供你更为复杂的查询数据的方式,还能建立索引,他的索引还是挺666的。
下面是自己看了阮一峰的 文章 http://www.ruanyifeng.com/blog/2018/07/indexeddb.html
简单的学习了下 IndexedDB 对这个浏览器数据库有个大概的了解,下面是个人对IndexedDB 简单的封装。
const dbName = "test";
const dbVersion = 1; export default {
// indexedDB兼容
indexedDB:
window.indexedDB ||
window.webkitindexedDB ||
window.msIndexedDB ||
window.mozIndexedDB,
//name:表名 key:主键 ,cursorIndex 索引
store: {
teacher: {
name: "teacher",
key: "id",
cursorIndex: [{ name: "teachNum", unique: false }]
},
student: {
name: "student",
key: "id",
cursorIndex: [{ name: "stuNum", unique: false }]
}
},
async initDB() {
let that = this;
let request = this.indexedDB.open(dbName, dbVersion);
request.onerror = function() {
console.log("打开数据库失败");
}; request.onsuccess = function() {
console.log("打开数据库成功");
};
request.onupgradeneeded = function(event) {
let db = event.target.result;
for (var t in that.store) {
if (!db.objectStoreNames.contains(that.store[t].name)) {
var objectStore = db.createObjectStore(that.store[t].name, {
keyPath: that.store[t].key,
autoIncrement: true
});
for (let i = 0; i < that.store[t].cursorIndex.length; i++) {
const element = that.store[t].cursorIndex[i];
objectStore.createIndex(element.name, element.name, {
unique: element.unique
});
}
}
}
};
},
// 打开数据库
openDB: function() {
return new Promise((resolve, reject) => {
let request = this.indexedDB.open(dbName, dbVersion); request.onerror = function(event) {
reject("IndexedDB数据库打开错误," + event);
};
request.onsuccess = function(event) {
resolve(event.target.result);
};
});
},
// 删除表
deleteDB: function(table) {
let deleteQuest = this.indexedDB.deleteDatabase(table);
deleteQuest.onerror = function() {
return Promise.resolve(false);
};
deleteQuest.onsuccess = function() {
return Promise.resolve(true);
};
},
// 关闭数据库
closeDB: async function(db) {
try {
let d;
if (!db) {
d = await this.openDB();
}
let closeQuest = d.closeDB();
return new Promise(resolve => {
closeQuest.onerror = function() {
resolve(false);
};
closeQuest.onsuccess = function() {
resolve(true);
};
});
} catch (error) {
return Promise.resolve(false);
}
},
// 添加数据,add添加新值
insert: async function(table, data) {
try {
let db = await this.openDB();
let request = db
.transaction(table.name, "readwrite")
.objectStore(table.name)
.add(data); return new Promise((resolve, reject) => {
request.onerror = function() {
reject("添加数据出错");
};
request.onsuccess = function() {
resolve(true);
};
});
} catch (error) {
console.log(error);
return Promise.resolve(false);
}
},
// 更新
update: async function(table, data) {
try {
let db = await this.openDB();
let request = db
.transaction(table.name, "readwrite")
.objectStore(table.name)
.put(data);
return new Promise(resolve => {
request.onerror = function() {
resolve(false);
};
request.onsuccess = function() {
resolve(true);
};
});
} catch (error) {
return Promise.resolve(false);
}
},
// 删除数据
delete: async function(table, keyValue) {
try {
let db = await this.openDB();
let request = db
.transaction(table.name, "readwrite")
.objectStore(table.name)
.delete(keyValue);
return new Promise(resolve => {
request.onerror = function() {
resolve(false);
};
request.onsuccess = function() {
resolve(true);
};
});
} catch (error) {
return Promise.resolve(false);
}
},
// 清空数据
clear: async function(table) {
let db = await this.openDB();
let store = db.transaction(table.name, "readwrite").objectStore(table.name);
store.clear();
},
// 查询数据 表名 索引值 索引 key 没有value key为key 而不是索引
get: async function(table, keyValue, indexCursor) {
try {
let db = await this.openDB();
let store = db
.transaction(table.name, "readonly")
.objectStore(table.name);
let request;
request = !keyValue
? store.openCursor()
: indexCursor
? store.index(indexCursor).get(keyValue)
: store.get(keyValue);
let data = [];
return new Promise(resolve => {
request.onerror = function() {
resolve("查询数据失败");
};
request.onsuccess = function(event) {
if (!keyValue && !indexCursor) {
if (event.target.result) {
data.push(event.target.result.value);
event.target.result.continue();
} else {
resolve(data);
}
} else {
resolve([event.target.result]);
}
};
});
} catch (error) {
return Promise.reject(error);
}
},
// 通过游标操作数据, callback中要有游标移动方式
handleDataByCursor: async function(table, keyRange) {
try {
let kRange = keyRange || "";
let db = await this.openDB();
let store = db.transaction(table, "readwrite").objectStore(table),
request;
request = store.openCursor(kRange);
return new Promise(resolve => {
request.onerror = function() {
resolve("通过游标获取数据报错");
};
request.onsuccess = function(event) {
let cursor = event.target.result;
resolve(cursor);
};
});
} catch (error) {
return Promise.reject(error);
}
},
// 通过索引游标操作数据, callback中要有游标移动方式
handleDataByIndex: async function(table, keyRange, sursorIndex) {
try {
let kRange = keyRange || "";
let db = await this.openDB();
let store = db.transaction(table, "readwrite").objectStore(table),
request;
request = store.index(sursorIndex).openCursor(kRange);
return new Promise(resolve => {
request.onerror = function() {
resolve("通过索引游标获取数据报错");
};
request.onsuccess = function(event) {
let cursor = event.target.result;
if (cursor) {
resolve(cursor);
}
};
});
} catch (error) {
return Promise.reject(error);
}
},
// 创建游标索引
createCursorIndex: async function(table, cursorIndex, unique) {
var db = await this.openDB();
let store = db.transaction(table, "readwrite").objectStore(table);
store.createIndex(cursorIndex, cursorIndex, {
unique: unique
});
return Promise.resolve();
}
};
此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。
如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。
IndexedDB 简单封装的更多相关文章
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- FMDB简单封装和使用
工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...
- Android--Retrofit+RxJava的简单封装(三)
1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...
- okhttp3 get post 简单封装
最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- 对pymysql的简单封装
#coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...
- iOS开发——UI篇OC篇&UITableView简单封装
UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...
- iOS sqlite 增删改查 简单封装(基于 FMDB)
/** * 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * * 基于 FMDB * * 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...
- ADO简单封装(MFC)
简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...
随机推荐
- ZOJ 2507 Let's play a game
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1507 MisereNim博弈.代码如下: //=========== ...
- HttpServerUtility常用方法
//HttpServerUtility是一个工具类,为了在后台处理请求方便获取到一些常用的类型,Asp.net将很多常用的东西封装到这里. // 获取服务器的计算机名称. public string ...
- 在 ASP.NET Core 中发送邮件遇到的坑_学习笔记
功能需求 因为项目需要有个忘记密码验证邮箱再重新修改密码的功能,然后我选用了很简单的一个方案,通过验证登录用户的邮箱然后发送邮件,通过这个邮件发送的链接地址来最后实现密码修改的小功能. 项目环境及实现 ...
- CCS中CMD文件解析
http://blog.csdn.net/u011392772/article/details/49760897 gel文件中主要包含了PLL.DDR等的初始化工作,具体可以看一下gel源码就明白了: ...
- 用angular制作简单的选项卡
现在angular变得挺火热的,自己也去简单的学习了一下,学了几天下来觉得angular果然好用,但是现在只是停留在比较浅的层面上,要想学好angular还是得下一番功夫的.学了一点新知识就想和大家分 ...
- ERC20数字货币ProxyOverflow存在漏洞
ERC20的ProxyOverflow漏洞造成影响广泛,本文将对其攻击方法进行分析,以便于智能合约发布者提高自身代码安全性以及其他研究人员进行测试.本文选择传播广泛.影响恶劣的SMT漏洞(CVE-20 ...
- MySQL远程连接失败(错误码:2003)
一 环境信息 服务器系统:Ubuntu 18.04 服务器MySQL版本:14.14 Distrib 5.7.25 本地系统:Kali Linux 本地客户端:python3交互模式 本地开发环境:p ...
- 分布式文件系统 fastdfs搭建
fastdfs第一步:在home文件夹下建立tar文件夹第二步:cd /home/tar///(Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( e ...
- 2019.03.29 NOIP训练 友好国度(点分治+容斥)
传送门 思路: 直接上点分治+容斥计算每个因数对应的贡献即可. 代码: #include<bits/stdc++.h> #define ri register int using name ...
- windows 2008解决120天授权过期问题(亲测可用)
https://blog.csdn.net/tladagio/article/details/80503198 最后的注册号码可以是:就是那个注册号码:5296992 4954438 6565792. ...