IndexedDB是HTML5规范里新出现的浏览器里内置的数据库。对于在浏览器里存储数据,你可以使用cookies或local storage,但它们都是比较简单的技术,而IndexedDB提供了类似数据库风格的数据存储和使用方式。存储在IndexedDB里的数据是永久保 存,不像cookies那样只是临时的。IndexedDB里提供了查询数据的功能,在online和offline模式下都能使用。你可以用 IndexedDB存储大型数据。
IndexedDB里数据以对象的形式存储,每个对象都有一个key值索引。IndexedDB里的操作都是事务性的。一种对象存储在一个 objectStore里,objectStore就相当于关系数据库里的表。IndexedDB可以有很多 objectStore,objectStore里可以有很多对象。每个对象可以用key值获取。
IndexedDB vs LocalStorage
IndexedDB和LocalStorage都是用来在浏览器里存储数据,但它们使用不同的技术,有不同的用途,你需要根据自己的情况适当的选择 使用哪种。LocalStorage是用key-value键值模式存储数据,但跟IndexedDB不一样的是,它的数据并不是按对象形式存储。它存储 的数据都是字符串形式。如果你想让LocalStorage存储对象,你需要借助JSON.stringify()
能将对象变成字符串形式,再用JSON.parse()
将字符串还原成对象。但如果要存储大量的复杂的数据,这并不是一种很好的方案。毕竟,localstorage就是专门为小数量数据设计的,它的api是同步的。
IndexedDB很适合存储大量数据,它的API是异步调用的。IndexedDB使用索引存储数据,各种数据库操作放在事务中执行。IndexedDB甚至还支持简单的数据类型。IndexedDB比localstorage强大得多,但它的API也相对复杂。
对于简单的数据,你应该继续使用localstorage,但当你希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB能提供你更为复杂的查询数据的方式。
IndexedDB vs Web SQL
WebSQL也是一种在浏览器里存储数据的技术,跟IndexedDB不同的是,IndexedDB更像是一个NoSQL数据库,而WebSQL更像是关系型数据库,使用SQL查询数据。W3C已经不再支持这种技术。具体情况请看:http://www.w3.org/TR/webdatabase/。
因为不再支持,所以你就不要在项目中使用这种技术了。
IndexedDB vs Cookies
Cookies(小甜点)听起来很好吃,但实际上并不是。每次HTTP接受和发送都会传递Cookies数据,它会占用额外的流量。例如,如果你有 一个10KB的Cookies数据,发送10次请求,那么,总计就会有100KB的数据在网络上传输。Cookies只能是字符串。浏览器里存储 Cookies的空间有限,很多用户禁止浏览器使用Cookies。所以,Cookies只能用来存储小量的非关键的数据。
IndexedDB的用法
想要理解IndexedDB,最好的方法是创建一个简单的web应用:把你们班的学生的学号和姓名存储在IndexedDB里。IndexedDB里提供了简单的增、删、改、查接口。
打开一个IndexedDB数据库
首先,你需要知道你的浏览器是否支持IndexedDB。请使用最新版的谷歌浏览器或火狐浏览器。低版本的IE是不行的。
- window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
- if(!window.indexedDB)
- {
- console.log("你的浏览器不支持IndexedDB");
- }
一旦你的浏览器支持IndexedDB,我们就可以打开它。你不能直接打开IndexedDB数据库。IndexedDB需要你创建一个请求来打开它。
- var request = window.indexedDB.open("testDB", 2);
第一个参数是数据库的名称,第二个参数是数据库的版本号。版本号可以在升级数据库时用来调整数据库结构和数据。
但你增加数据库版本号时,会触发onupgradeneeded
事件,这时可能会出现成功、失败和阻止事件三种情况。
- var db;
- request.onerror = function(event){
- console.log("打开DB失败", event);
- }
- request.onupgradeneeded = function(event){
- console.log("Upgrading");
- db = event.target.result;
- var objectStore = db.createObjectStore("students", { keyPath : "rollNo" });
- };
- request.onsuccess = function(event){
- console.log("成功打开DB");
- db = event.target.result;
- }
onupgradeneeded
事件在第一次打开页面初始化数据库时会被调用,或在当有版本号变化时。所以,你应该在onupgradeneeded
函数里创建你的存储数据。如果没有版本号变化,而且页面之前被打开过,你会获得一个onsuccess
事件。如果有错误发生时则触发onerror
事件。如果你之前没有关闭连接,则会触发onblocked
事件。
在上面的代码片段里,我们创建了一个Object Store,叫做“students”,用“rollNo”做数据键名。
往ObjectStore里新增对象
为了往数据库里新增数据,我们首先需要创建一个事务,并要求具有读写权限。在indexedDB里任何的存取对象的操作都需要放在事务里执行。
- var transaction = db.transaction(["students"],"readwrite");
- transaction.oncomplete = function(event) {
- console.log("Success");
- };
- transaction.onerror = function(event) {
- console.log("Error");
- };
- var objectStore = transaction.objectStore("students");
- objectStore.add({rollNo: rollNo, name: name});
从ObjectStore里删除对象
删除跟新增一样,需要创建事务,然后调用删除接口,通过key删除对象。
- db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);
我把语句合并到了一起,变得更简单,但效果是一样的。
通过key取出对象
往get()
方法里传入对象的key值,取出相应的对象。
- var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);
- request.onsuccess = function(event){
- console.log("Name : "+request.result.name);
- };
更新一个对象
为了更新一个对象,首先要把它取出来,修改,然后再放回去。
- var transaction = db.transaction(["students"],"readwrite");
- var objectStore = transaction.objectStore("students");
- var request = objectStore.get(rollNo);
- request.onsuccess = function(event){
- console.log("Updating : "+request.result.name + " to " + name);
- request.result.name = name;
- objectStore.put(request.result);
- };
相关推荐
NULL 博文链接:https://weistar.iteye.com/blog/2186673
NULL 博文链接:https://bojustgo.iteye.com/blog/2165845
ngx-indexed-db ngx-indexed-db是一项服务,结合了ngx-indexed-db ,将IndexedDB数据库包装在Angular服务中。安装$ npm install ngx-indexed-db或者$ yarn add ngx-indexed-db用法导入NgxIndexedDBModule并启动它: ...
使用IndexedDB数据库适配器将共享数据持久存储在浏览器中。 下次您加入会话时,所做的更改仍然存在。 最小化服务器和客户端之间交换的数据量使离线编辑成为可能入门您可以找到在线发布的完整文档: 。 npm i --save...
但是如果在浏览器上需要用到数据库一般会使用Indexed DB数据库,webSQL基本上已经废弃了,具体原因小伙伴可以下来自己查查。 IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型...
IndexedDB,支持浏览器缓存
IndexedDB简介:浏览器内数据库 应用程序需要数据。 对于大多数Web应用程序,数据存储在服务器上进行组织和管理,并通过网络请求将其提供给客户端。 随着浏览器的功能越来越强大,用于存储和操作应用程序数据的选项...
使用索引数据库 带有承诺的轻量级(gzip压缩)钩子,可在React中轻松访问IndexedDB :anchor: :wrench: 安装 npm i use-indexeddb # npm yarn add use-indexeddb # yarn :books: 故事书 :sparkles: 特征 :leaf_...
索引数据库 索引数据库示例
indexedDB的CURD 设置数据库名称 var db = new indexDB("myDB"); 创建新表 db.CreateTable("product", "id"); 插入和更新命令 db.set({ id: 1, name: "milad" }, "product"); 获取数据 db.get(1, "product"); 删除...
logs2indexeddb 该实用程序可将所有JavaScript控制台日志连续保存到IndexedDB数据库中。 关闭浏览器选项卡后,您可以访问console。*日志。 对于需要在一段时间后分析Web客户端日志的开发人员而言,此实用程序是一个...
丛林数据库 JungleDB是NodeJS(LMDB或LevelDB)和浏览器(IndexedDB)的简单数据库抽象层,支持高级功能,例如具有读取隔离和辅助索引的事务。快速开始使用jungle-db的最简单选择是从npm存储库中安装它。 npm ...
角度索引数据库 一个 angularjs 服务提供者,使用带有 angular 的 indexedDB ####Important:这个存储库不再由我维护。 查看当前版本,因为接任成为主要贡献者。 安装 建议使用 Bower 进行安装。 鲍尔 在命令行上调...
此模块仅在Web浏览器中工作,如果IndexedDB不可用,则会回退到内存: const fortune = require ( 'fortune' ) const indexedDBAdapter = require ( 'fortune-indexeddb' ) const store = fortune ( recordTypes , {...
索引数据库 IndexedDB 的应用示例。 我可以用吗? 添加对笨蛋浏览器的支持;) 你想了解更多吗? 去做 自动化测试 * * * 。 可能是一个有用的指南。 使用 Observable 简化 API: * 创建一个表示数据集的 Hash...
从IndexedDB导出并导入另一个IndexedDB的Javascript代码,以便导出所有“ Great Suspender”保存的会话,并将它们导入到另一个扩展的IndexedDB(如果兼容)中,或在先前版本的“ The Great Suspender”中导入 ...
它提供: 用于配置数据库和迁移/升级的服务与数据库交互的服务用于IndexedDB的余烬数据适配器这套实用程序使从API查询数据,将数据放入IndexedDB以及与本地数据库一起使用以实现完整的脱机功能成为可能。...
IndexedDB的纯JavaScript持久性实现。 什么在哪里讨论 文献资料 来源 问题 CI 承保范围: 执照: 麻省理工学院从NPM安装IndexedDB。 npm install indexeddb该README.md也是使用单元测试框架的单元测试。 我们将使用...
ccl_chrome_indexeddb 该存储库包含(有时是部分)对Chrome风格应用程序中读取IndexedDB数据所涉及技术的重新实现。 这包括: Swift的减压 级别数据库 V8对象反序列化 闪烁对象反序列化 IndexedDB包装器 博客 在...
浏览器端 indexed db 封装成更简洁易操作的接口, 数据库变化监控!