摘要:因为写起来简洁,所以用写法来作说明接口由提供,异步使用数据库中的事件对象属性。所有的读取和写入数据均在中完成。由发起,通过来设置的模式例如是否只读或读写,以及通过来获得一个。
//因为ES6写起来简洁,所以用ES6写法来作说明 //IDBTransacation接口由IndexedDB API提供,异步transaction使用数据库中的事件对象属性。所有的读取和写入数据均在transactions中完成。由IDBDatabase发起transaction,通过IDBTransaction 来设置transaction的模式(例如是否只读或读写),以及通过IDBObjectStore来获得一个request。同时你也可以使用它来中止transactions。 let idxDB = { db: {}, transaction: {}, startTransaction() { //一个IDBTransacation只能使用一次 //创建transaction有3个要求,一、有connection(数据库连接),二、storeName(读取的store名)、三、mode(包括readonly,readwrite和versionchange) this.transaction = this.db.transaction("diary", "readwrite"); this.transaction.oncomplete = () => console.log("transaction complete"); this.transaction.onerror = e => console.dir(e); }, initDB() { //下面一行代码,以数据库名(danote)和版本号(1)为参数,异步打开一个数据库 let request = indexedDB.open("danote", 1); request.onerror = e => console.log(e.currentTarget.error.message); request.onsuccess = e => this.db = e.target.result; request.onupgradeneeded = e => { //如果之前数据库不存在,也会运行onupgradeneeded //新建objectStore let thisDB = e.target.result; if (!thisDB.objectStoreNames.contains("diary")) { let objStore = thisDB.createObjectStore("diary", { keyPath: "id", autoIncrement: true }); //第一个参数是index名称,第二个参数是keyPath objStore.createIndex("by_create_date", "create_date", { unique: false }); } }; }, closeDB() { //主动close一个connection(其实没什么意义,在被垃圾回收机制清除或创建上下文被destroy,connection会自动close) db.close(); }, deleteDB() { indexedDB.deleteDatabase("danote"); }, addData(data, cb) { this.startTransaction(); //Object Store是indexedDB的主要储存机制 //IDBTransaction.objectStore()返回你查询的objectStore(IDBObjectStore对象) let objectStore = this.transaction.objectStore("diary"); let request = objectStore.add(data); request.onsuccess = () => { if (cb) cb({ error: 0, data: data }) }; request.onerror = () => { if (cb) cb({ error: 1 }) }; }, clearObjectStore(id, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let request = objectStore.clear(); request.onsuccess = () => { if (cb) cb({ error: 0, data: id }); }; request.onerror = () => { if (cb) cb({ error: 1 }); }; }, addmData(mdata, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); for (let c = 0; c < mdata.length; c++) { let request = objectStore.add(mdata[c]); request.onerror = () => { if (cb) cb({ error: 1 }) } } }, deleteData(id, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let request = objectStore.delete(id); request.onsuccess = () => { if (cb) cb({ error: 0, data: id }) }; request.onerror = () => { if (cb) cb({ error: 1 }) } }, getDataById(id, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let request = objectStore.get(id); request.onsuccess = () => { if (cb) cb({ error: 0, data: e.target.result }) }; request.onerror = () => { if (cb) cb({ error: 1 }) } }, getDataAll(cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let rowData = []; objectStore.openCursor(IDBKeyRange.lowerBound(0)).onsuccess = (e) => { let cursor = e.target.result; if (!cursor && cb) { cb({ error: 0, data: rowData }); return; } rowData.unshift(cursor.value); cursor.continue(); }; }, updateData(id, updateData, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let request = objectStore.get(id); request.onsuccess = e => { let thisDB = e.target.result; for (key in updateData) { thisDB[key] = updateData[key]; } objectStore.put(thisDB); if (cb) cb({ error: 0, data: thisDB }) }; request.onerror = e => { if (cb) cb({ error: 1 }) } }, getDataBySearch(keywords, cb) { this.startTransaction(); let objectStore = this.transaction.objectStore("diary"); let boundKeyRange = IDBKeyRange.only(keywords); let rowData = []; objectStore.index("folder").openCursor(boundKeyRange).onsuccess = e => { let cursor = e.target.result; if (!cursor) { if (cb) cb({ error: 0, data: rowData }) return; } rowData.push(cursor.value); cursor.continue(); }; }, getDataByPager(start, end, cb) { this.startTransaction(); let objectStore = transaction.objectStore("diary"); let boundKeyRange = IDBKeyRange.bound(start, end, false, true); //关于keyRange https://www.w3.org/TR/IndexedDB/#dfn-key-range let rowData = []; objectStore.openCursor(boundKeyRange).onsuccess = e => { let cursor = e.target.result; if (!cursor && cb) { cb({ error: 0, data: rowData }); return; } rowData.push(cursor.value); cursor.continue(); }; } } //objectStore的名称在例子里全都写死了,因为我只建了一个objectStore,使用时建议还是以参数传进函数
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82494.html
摘要:因为写起来简洁,所以用写法来作说明接口由提供,异步使用数据库中的事件对象属性。所有的读取和写入数据均在中完成。由发起,通过来设置的模式例如是否只读或读写,以及通过来获得一个。 //因为ES6写起来简洁,所以用ES6写法来作说明 //IDBTransacation接口由IndexedDB API提供,异步transaction使用数据库中的事件对象属性。所有的读取和写入数据均在trans...
摘要:在不可以用的前提下,无论是同步化或者链式操作都用不了。于是昨天我自己实现了一个简单的同步执行的,并以此为基础实现了链式操作。 前言 本来这个系列应该不会这么快更新,然而昨晚写完前一篇后才发现我的思路中有一个巨大的漏洞。导致我在前一篇中花费大量时间实现了一个复杂的Transaction类——其实完全有更简单的方式来完成这一切。前篇:http://segmentfault.com/a/11...
背景 随着前端技术日新月异地快速发展,web应用功能和体验也逐渐发展到可以和原生应用媲美的程度,前端缓存技术的应用对这起到了不可磨灭的贡献,因此想一探前端的缓存技术,这篇文章主要会介绍在日常开发中比较少接触的IndexedDB IndexedDB 什么是IndexedDB IndexedDB简单理解就是前端数据库,提供了一种在用户浏览器中持久存储数据的方法,但是和前端关系型数据不同的是,Index...
摘要:综上,对进行一定的封装,来简化编码操作。化的尝试对于这种带大量回调的,使用进行异步化封装是个好主意。因此包括在内的所有异步方法都会强制中止当前事务。这就决定了一个事务内部的所有操作必须是同步完成的。目前只实现了和,其他的有待下一步工作。 前言 本文是介绍我在编写indexedDB封装库中诞生的一个副产品——如何让indexedDB在支持链式调用的同时,保持对事务的支持。项目地址:htt...
阅读 3392·2021-09-22 16:00
阅读 3435·2021-09-07 10:26
阅读 2906·2019-08-30 15:55
阅读 2834·2019-08-30 13:48
阅读 1355·2019-08-30 12:58
阅读 2141·2019-08-30 11:15
阅读 921·2019-08-30 11:08
阅读 493·2019-08-29 18:41