文章插图
(2)特点及使用场景indexedDB 特点如下:
- 可以将任何 JavaScript 类型的数据存储为键值对,例如对象(blob、文件)或数组等 。
- IndexedDB API 是异步的,不会在数据加载时停止页面的渲染 。
- 可以存储结构化数据,例如 Date、视频、图像对象等 。
- 支持数据库事务和版本控制 。
- 可以存储大量数据 。
- 可以在大量数据中快速定位/搜索数据 。
- 数据库是域专用的,因此任何其他站点都无法访问其他网站的 IndexedDB 存储,这也称为同源策略 。
- 存储用户生成的内容: 例如表单,在填写表单的过程中,用户可以离开并稍后再回来完成表单,存储之后就不会丢失初始输入的数据 。
- 存储应用状态: 当用户首次加载网站或应用时,可以使用 IndexedDB 存储这些初始状态 。可以是登录身份验证、API 请求或呈现 UI 之前所需的任何其他状态 。因此,当用户下次访问该站点时,加载速度会增加,因为应用已经存储了状态,这意味着它可以更快地呈现 UI 。
- 对于离线工作的应用: 用户可以在应用离线时编辑和添加数据 。当应用程序来连接时,IndexedDB 将处理并清空同步队列中的这些操作 。
const indexedDB =window.indexedDB ||window.mozIndexedDB ||window.webkitIndexedDB ||window.msIndexedDB ||window.shimIndexedDB;if (!indexedDB) {console.log("不支持 IndexedDB");}
可以使用 indexedDB.open() 来连接数据库:const dbOpen = indexedDB.open('performance', 1);
indexedDB.open 的第一个参数是数据库名称,第二个参数是可选的版本整数 。可以使用以下三个事件处理函数监听 indexedDB 的连接状态:
① onerror在无法建立 IndexedDB 连接时,将触发该事件:
// 连接失败dbOpen.onerror = e => {reject(`IndexedDB error: ${ e.target.errorCode }`);};
如果在无痕模式、隐私模式下运行浏览器,可能不支持 IndexedDB,需要禁用这些模式 。② onupgradeneeded一旦数据库连接打开,就会触发 onupgradeneeded 事件,该事件可用于创建 object store 。
dbOpen.onupgradeneeded = e => {const db = dbOpen.result;// 创建 object storeconst store = db.createObjectStore("cars", { keyPath: "id" });// 使用自动递增的id// const store = db.createObjectStore('cars', { autoIncrement: true });// 创建索引store.createIndex("cars_colour", ["colour"], {unique: true});// 创建复合索引store.createIndex("colour_and_make", ["colour", "make"], {unique: false,});};
IndexedDB 使用了 object store 的概念,其本质上是数据集合的名称 。可以在单个数据库中创建任意数量的 object store 。keyPath是 IndexedDB 将用来识别对象字段名称,通常是一个唯一的编号,也可以通过 autoIncrement: true 来自动为 store 设置唯一递增的 ID 。除了普通的索引,还可以创建复合索引,使用多个关键词的组合进行查询 。③ onsuccess在连接建立并且所有升级都完成时,将触发该事件 。上面我们已经新建了 schema,接下来就可以在onsuccess 中添加、查询数据 。
// 连接成功dbOpen.onsuccess = () => {this.db = dbOpen.result;//1const transaction = db.transaction("cars", "readwrite");//2const store = transaction.objectStore("cars");const colourIndex = store.index("cars_colour");const makeModelIndex = store.index("colour_and_make");//3store.put({ id: 1, colour: "Red", make: "Toyota" });store.put({ id: 2, colour: "Red", make: "Kia" });store.put({ id: 3, colour: "Blue", make: "Honda" });store.put({ id: 4, colour: "Silver", make: "Subaru" });//4const idQuery = store.get(4);const colourQuery = colourIndex.getAll(["Red"]);const colourMakeQuery = makeModelIndex.get(["Blue", "Honda"]);// 5idQuery.onsuccess = function () {console.log('idQuery', idQuery.result);};colourQuery.onsuccess = function () {console.log('colourQuery', colourQuery.result);};colourMakeQuery.onsuccess = function () {console.log('colourMakeQuery', colourMakeQuery.result);};// 6transaction.oncomplete = function () {db.close();};};
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 六种常见妇科炎症 妇科炎症用什么药好
- 陶渊明的最经典10句诗,陶渊明的经典诗句精选-
- 约翰尼·德普|知名女星街头大便,裤子拉到大腿下,好友坐旁边与其聊天
- 沉头螺钉操作方法及常见问题 开槽沉头螺钉!
- 中速磨常见故障现象及处理 中速磨常见故障
- 过敏性鼻炎的症状有哪些常见表现 过敏性鼻炎的症状
- 电脑常见故障排查及维修方法 电脑故障检测
- 常见妇科病 常见妇科病的症状
- 鲍鱼养殖技术流程及常见病害的防治 鲍鱼养殖
- 乳腺增生的六种常见中成药 乳腺增生吃啥药