indexDB 使用方法
MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API
流程
step 1 打开(新建)数据库
- 创建 indexDB 开启指令的实例对象
var DBrequest = window.indexedDB.open('localData'),
// 用于记录打开的数据库对象
DBresult;
-
监听开启结果,分为:
- onsuccess 开启成功
- onerror 开启失败
- onupgradeneeded 打开失败-原因没有数据库 or 数据库版本过低,执行升级 or 新建
执行新建命令后,onupgradeneeded 指令会比 onsuccess 先执行
Tips:indexDB 不同版本的数据库是不同的
// 开启成功
DBrequest.onsuccess = function (ev) {
console.log('success', ev.target.result);
// 保存数据库的对象
DBresult = ev.target.result;
};
// 开启失败
DBrequest.onerror = function (ev) {
console.log('error', ev.target.result);
};
// 版本过低,自动升级 & 新建数据库后进入
DBrequest.onupgradeneeded = function (ev) {
// 保存新建立的数据库对象,并直接用于新建数据表中
DBresult = ev.target.result;
console.log('upgrading', DBrequest);
// TODO: 可在此处新建数据表
};
step 2 新建数据表
新建数据表只能在新建数据库下执行
在新建数据表之前,可以先检查一次数据表是否已存在
if (!DBresult.objectStoreNames.contains('testTable')) {
// 新建数据表testTable,并设置主键为id
let objectStore = DBresult.createObjectStore('testTable', {keyPath: 'id'});
// 设置索引
objectStore.createIndex('time', 'time', {unique: false});
}
step 3 增删查改
indexDB 的增删查改操作都是通过事务实现的
即 transaction,也就是在进行增删查改操作前,需新建一个事务:
let DBstore = DBresult.transaction('testTable', 'readwrite')
.objectStore('testTable');
transaction(..)
新建一个事务,该方法接受的第一个参数是要进行操作的目标数据表,第二个参数是当前操作的权限(readonly 只读,readwrite 读写);
readonly 只能应用在读取功能上
readwrite 可以用于所有功能
.objectStore(..)
新建一个对象库(object store),对象库中的记录根据其键值进行排序,并通过排序实现快速插入,查找和有序检索;
-
新增数据
每次只能添加一条数据
每添加一条数据需要重新声明 DBstore,否则会报“主键重复”错误
let insertData = {
id: '001',
name: 'tom',
time: '20191011'
},
// 添加的数据实例,用于监听添加结果
DBaddstore;
// 插入数据
DBaddstore = DBstore.add(insertData);
/* 当用循环添加多条数据时,记得要在每次循环处重新调用一次DBstore
* DBresult.transaction('testTable', 'readwrite')
.objectStore('testTable')
.add(...)
*/
// 监听插入结果
// 插入成功
DBaddstore.onsuccess = function(ev) {..};
// 插入失败
DBaddstore.onerror = function(ev) {..};
-
删除数据
删除指定键值的单条数据
let deleteKey = '002',
// 删除的数据实例,用于监听删除结果
DBelstore;
// 删除数据
DBdelstore = DBstore.delete(deleteKey);
// 监听删除结果
// 删除成功
DBdelstore.onsuccess = function(ev) {..}
// 删除失败
DBdelstore.onerror = function(ev) {..}
-
读取数据
读取数据分为读取指定数据和读取全部数据
- 读取指定索引数据
- 使用
index(key).get(value)
方法,获取指定索引下的单条数据 - 使用
index(key).getAll(value)
方法,获取指定索引下的多条数据
- 使用
let key = { index: 'time', value: '20111111' }, // 获取数据的实例,用于监听获取结果 & 获取查找到的数据 DBgetstore; if (!!key) { // 获取time索引为20111111的所有数据 DBgetstore = DBstore.index(key.index).getAll(key.value); // 获取time索引为20111111的第一条数据 DBgetstore = DBstore.index(key.index).get(key.value); }
- 读取全部数据
使用
getAll()
方法,获取数据库内所有数据let DBgetstore = DBstore.getAll();
- 处理并使用读取到的数据
// 读取成功 DBgetstore.onsuccess = function(ev) { console.log('getLocalData success!', ev.target.result); // 处理读取到的数据 dosomething(ev.target.result); } // 读取失败 DBgetstore.onerror = function(ev) {..}
- 读取指定索引数据
-
修改数据(暂未使用到此功能)