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);
};

所有的源代码都在这里。如果有任何的问题,请留言,或通过 @歪脖骇客 给我私信。

原文:http://www.webhek.com/indexeddb/

代码:

<!DOCTYPE html>
<html><head><title>IndexedDB</title><script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script><script type="text/javascript">$(document).ready(function(){window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;var request, db;if(!window.indexedDB){console.log("Your Browser does not support IndexedDB");}else{request = window.indexedDB.open("testDB", 2);request.onerror = function(event){console.log("Error opening 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("Success opening DB");db = event.target.result;}}$("#addBtn").click(function(){var name = $("#name").val();var rollNo = $("#rollno").val();var transaction = db.transaction(["students"],"readwrite");transaction.oncomplete = function(event) {console.log("Success :)");$("#result").html("Add : Success");};transaction.onerror = function(event) {console.log("Error :(");$("#result").html("Add : Error");};var objectStore = transaction.objectStore("students");objectStore.add({rollNo: rollNo, name: name});});$("#removeBtn").click(function(){var rollNo = $("#rollno").val();db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);});$("#getBtn").click(function(){var rollNo = $("#rollno").val();var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);request.onsuccess = function(event){$("#result").html("Name : "+request.result.name);};});$("#updateBtn").click(function(){var rollNo = $("#rollno").val();var name = $("#name").val();var transaction = db.transaction(["students"],"readwrite");var objectStore = transaction.objectStore("students");var request = objectStore.get(rollNo);request.onsuccess = function(event){$("#result").html("Updating : "+request.result.name + " to " + name);request.result.name = name;objectStore.put(request.result);};});});</script></head><body><form>Roll No <input type="text" name="rollno" id="rollno"/><br>Name <input type="text" name="name" id="name" /><br><input type="button" name="addBtn" value="Add" id="addBtn"/><input type="button" name="removeBtn" value="Remove" id="removeBtn"/><input type="button" name="getBtn" value="Get" id="getBtn"/><input type="button" name="updateBtn" value="Update" id="updateBtn"/></form><div id="result"></div></body>
</html>

IndexedDB:浏览器里内置的数据库相关推荐

  1. NNM内置的数据库Solid定期备份配置方法

    NNM内置的数据库Solid会定期自动备份: 我们可以通过$OV_DB/analysis/default/solid.ini配置文件进行相关的配置: 停止备份 1. edit the file    ...

  2. 浏览器将内置防止 ,“网络钓鱼” 及恶意软件功能,真的很好用!

    目录 Chrome Android 浏览器将内置防止 "网络钓鱼" 及恶意软件功能. 软件名称 Chrome Android 另有手机版的Chrome浏览器,于2012年发布了Ch ...

  3. python只能使用内置数据库_隐藏彩蛋:你知道python有一个内置的数据库吗?

    本文转载自公众号"读芯术"(ID:AI_Discovery). 如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库--SQLite.它几乎拥有作为一个关系数据 ...

  4. php http_user_agent 微信浏览器改变为其他浏览器,微信内置浏览器HTTP_USER_AGENT

    随着微信的普及和微信公众号的营销日益增多,我们所面对的开发不再仅仅局限于传统的网站,微信开发也成为了我们程序猿的一项必修课程. 我们可以借助微信开发者工具进行微信小程序和微信公众号网页开发,但是在微信 ...

  5. dbeaver无法修改表数据_隐藏彩蛋:你知道python有一个内置的数据库吗?

    全文共2520字,预计学习时长7分钟 如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库--SQLite.它几乎拥有作为一个关系数据库所需的所有功能,而且这些有功能都保存在一个文 ...

  6. python操作内置Sqlite数据库

    转载自:http://www.cnblogs.com/yuxc/archive/2011/08/18/2143606.html 简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就 ...

  7. wps文字下载 wps2019怎么关掉内置浏览器?关闭内置浏览器步骤一览

    转载请说明来源于"厦门SEO" 本文地址:http://www.96096.cc/Article/169715.html wps文字下载   坚信很多小伙伴还不掌握wps2019关 ...

  8. 先有对象还是先有函数,鸡生蛋、蛋生鸡的问题。有关js里内置对象Function和Object的思考

    js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b). 同时js ...

  9. python数据库sqlite3_Python中内置了数据库?SQLite3 (苔花如米小,也学牡丹开)

    SQLite 一个超轻量级数据库,以娇小的"身材",不失性能速度并具可靠性,而经久不衰,当前在数据库流行排行榜稳居前8位,它同样是一个开源关系型数据库,任何人可用于商业或非商业用途 ...

最新文章

  1. redis, memcached, mongo性能比较
  2. myeclipse设置注释格式
  3. 过年(2015)读书笔记
  4. 服务器连接不稳定fifa,fifa服务器链接异常
  5. python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...
  6. 计算机启用时间 查找方式,电脑实用知识技巧 篇六:不需要第三方软件,这种方法查看系统启动时间...
  7. html广告20s倒计时,简单时尚的jQuery倒计时插件
  8. 在linux环境获取pcie卡信息,如何Linux下得到CPU、内存及PCI信息
  9. 常见 HTTP/FTP/WebSocket 错误代码大全 - 转
  10. 【风马一族_php】NO2_php基础知识
  11. 北京赛区参赛选手代表吴翼在开幕式上的发言稿完整版2011年11月02日 09:50:34
  12. mysql日志课程_【mysql课程七】 MySQL日志管理
  13. layui监听radio点击事件
  14. YOLOV4论文记录
  15. 基于WEB的本科毕业设计管理系统
  16. c语言编程马克思手稿 百例,清华大学出版社-图书详情-《C语言趣味编程100例》...
  17. 有关微信小程序云数据库修改数据的坑
  18. 【降维打击】解决加密视频录屏问题
  19. uniapp动态图片加载不出来
  20. 再生龙给分区安装linux,用Clonezilla再生龙备份还原UBUNTU(LINUX)系统分区(可以备份MAC系统分区)...

热门文章

  1. By Recognizing These Guys, We Find Social Networks Useful(HDU-3849)
  2. csv导入mysql_京东金融数据分析:MySQL+HIVE的结合应用案例详解【附全代码】
  3. 如何用计算机处理频谱,如何使用PicoScope PC示波器对CD播放器的音频频谱进行分析...
  4. sqllite java 代码,非常简单的SQLite的Java程序
  5. vue 前台文本修改触发事件_利用VBA代码禁用触发事件及对工作薄修改的保存方案...
  6. Anaconda+Win10安装
  7. linux sysfs link(sysfs_create_link)
  8. 立体视觉–stereo correspondence(双目立体匹配)
  9. 使用神经网络自动提取出它的特征码(1)
  10. nn.dropout()的用法,随机失活