当前位置: 首页 > Web前端 > HTML5

indexedDB入门

时间:2023-04-05 01:01:03 HTML5

概述IndexedDB是一个事务数据库系统,类似于基于SQL的RDBMS。然而,与使用固定列表不同的是,IndexedDB是一个基于JavaScript的面向对象的数据库。现有的浏览器数据存储方案不适合存储大量数据:cookie的大小不超过4KB,每次请求回传给服务器的LocalStorage在2.5MB到10MB之间(各种浏览器),不提供的搜索功能无法创建自定义索引。因此需要一个新的解决方案,这就是IndexedDB诞生的背景。简单的说,IndexedDB就是浏览器提供的本地数据库。IndexedDB具有以下特点键值对存储异步操作(避免锁定浏览器)支持事务同源限制(协议+域名+端口)存储空间大支持二进制存储(ArrayBuffer对象和Blob对象,可以存储文件数据)基本概念对比关系型数据库MySql可以获取以下关系型数据库:IDB数据库表:对象仓库(IDBObjectStore)行数据:对象仓库中存储的一条数据索引:IDBindex,用于加快数据检索(可以针对不同的key创建对象仓库)transaction:IDBTransaction操作Request:IDBRequestIDBCursor:遍历对象存储空间和索引IDBKeyRange:定义关键数据的范围基本操作兼容性注意点//全局变量兼容性问题window.indexedDB=window.indexedDB||窗口.mozIndexedDB||窗口.webkitIndexedDB||窗口.msIndexedDB;window.IDBTransaction=window.IDBTransaction||window.webkitIDBTransaction||window.msIDBTransaction;window.IDBKeyRange=window.IDBKeyRange||window.webkitIDBKeyRange||("您的浏览器不支持IndexedDB的稳定版本。这样那样的功能将不可用。");}数据库操作打开/新建数据库vardatabaseName="MyTestDatabase";vardatabaseVersion=1;//打开数据库varrequest=window.indexedDB.open(databaseName,databaseVersion);request.onsuccess=function(event){console.log("打开成功");};request.onerror=function(event){console.log("打开失败");};request.onupgradeneeded=function(event){};window.indexedDB.open函数打开对应的数据库,如果没有该数据库,则新建一个onupgradeneeded事件将在创建新数据库或数据库版本大于当前版本时触发。为什么数据库会有版本?因为数据库的数据解构可能会发生变化,一般修改数据解构的操作写在onupgradeneededtodeletedatabasewindow.indexedDB.deleteDatabase(databaseName);对象仓库操作(表操作)创建和修改表是修改数据库的数据解构,所以我把它们写在onupgradeneeded事件中创建表request.onupgradeneeded=function(event){console.log("需要升级");db=event.target.result;//创建仓库对象(创建表)//这里我设置主键为idvarobjectStore=db.createObjectStore(objectStoreName,{keyPath:"id",autoIncrement:true});};删除表request.onupgradeneeded=function(event){console.log("onupgradeneeded");db=event.target.result;//删除仓库对象(删除表)db.deleteObjectStore(objectStoreName);};数据操作(行数据操作)新增数据(增加)vardatabaseName="MyTestDatabase";vardatabaseVersion=1;vardb;varobjectStoreName="objectStore1";varstoreDatas=[{id:"1",name:"张三",age:18},{id:"2",name:"李四",age:19}];varrequest=window.indexedDB.open(databaseName,databaseVersion);request.onsuccess=function(event){console.log("开启成功");db=event.target.result;//将数据保存到新创建的对象存储varobjectStore=db.transaction([objectStoreName],"readwrite").objectStore(objectStoreName);storeDatas.forEach(function(dataItem){//添加一条数据objectStore.add(dataItem);});};删除数据(delete)vardatabaseName="MyTestDatabase";vardatabaseVersion=1;vardb;varobjectStoreName="objectStore1";varstoreDatas=[{id:"1",name:"张三",age:18},{id:"2",name:"李四",age:19}];varrequest=window.indexedDB.open(databaseName,databaseVersion);request.onsuccess=function(event){console.log("打开成功");db=event.target.result;console.log("删除数据");varreq=db.transaction([objectStoreName],"readwrite").objectStore(objectStoreName).delete("2");//这里的“2”指定主键的键值req.onsuccess=function(){console.log("删除成功");};req.onerror=function(){console.log("删除失败");};};修改数据(change)console.log("Updatedata");varreq=db.transaction([objectStoreName],"readwrite").objectStore(objectStoreName).put({id:"2",name:"王舞",age:17});//替换整条数据req.onsuccess=function(){console.log("更新成功");};req.onerror=function(){console.log("更新失败");};获取数据(检查)console.log("readdata");varreq=db.transaction([objectStoreName],"readonly").objectStore(objectStoreName).get("1");//这里的“1”也是主键的键值req.onsuccess=function(){console.log("获取成功");控制台日志(请求结果);};req.onerror=function(){console.log("获取失败");};通过指针对象遍历表数据console.log("遍历数据");varobjectStore=db.transaction([objectStoreName],"只读").objectStore(objectStoreName);varcount=0;objectStore.openCursor().onsuccess=function(event){varcursor=event.target.result;if(cursor){console.log(`section${++count}条数据为`);console.log(cursor.value);游标.continue();//将指针移动到下一个位置}else{console.log("Nomoredata");}};总结indexedDB中的API还是很多的,这里只简单介绍一下最常用的操作(个人认为^_^)参考文档IndexedDB_API浏览器数据库IndexedDB入门教程