循路觅宗师,形影不相离,师知吾亦知,吾乃成宗师。

BIBLE模型

发掘积累过程的快感

在HTML5前,现代浏览器的储存方案是通过cookie等技术实现。Cookie 必须在 HTML 文件的内容输出之前设置;不同的浏览器 (Netscape Navigator、Internet Explorer) 对 Cookie 的处理不一致,使用时一定要考虑;客户端用户如果设置禁止 Cookie,则 Cookie 不能建立。 并且在客户端,一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个。每次请求,都会将cookie带上,这增加了消耗,因此这不合适大量数据储存。

发展到HTML5之后,对数浏览器数据储存有了更多的选择,localstorageDB,localstorage存储的容量也有限制,不能存储太大的数据,但是这不会增加网络的消耗,可以作为小数据的本地储存。

IndexedDB用户本地数据》专题最重要的就是介绍IndexedDB 的简介发展和应用实例,会告诉大家如何配合后台语言作出一个比较实用的项目,同时更深入的了解IndexedDB这门技术。

IndexedDB简介

其实啊,IndexedDB是一种低级API,用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索。IndexedDB是一个事务型数据库系统,类似于基于SQL的RDBMS。 然而不同的是它使用固定列表,IndexedDB是一个基于JavaScript的面向对象的数据库。 IndexedDB允许您存储和检索用键索引的对象; 可以存储structured clone algorithm支持的任何对象。 你只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务中的数据。

使用IndexedDB,你可以存储或者获取数据,使用一个key索引的。 你可以在事务(transaction)中完成对数据的修改。和大多数web存储解决方案相同,IndexedDB也遵从同源协议(same-origin policy). 所以你只能访问同域中存储的数据,而不能访问其他域的。

API包含异步(asynchronous) API 和同步(synchronous)API两种。异步API适合大多数情况, 同步API必须同 WebWorkers一同使用。 目前,没有主流浏览器支持同步API, 即使同步API被支持了,你也会在大多数的情况使用异步API。

IndexedDB是WebSQL数据库的取代品, W3C组织在2010年11月18日废弃了webSql。IndexedDB 和WebSQL的不同点在于WebSQL是关系型数据库(复杂)IndexedDB是key-value型数据库(简单好使)。

基本概念

像其他key-value数据库一样(不是关系型数据库,nosql的):

IndexedDB 数据库使用key-value键值对储存数据
values 数据可以是结构非常复杂的对象,key可以使对象自身的属性。你可以对对象的某个属性创建索引(index)以实现快速查询和列举排序,key可以使二进制对象。
IndexedDB 是事务模式的数据库
任何操作都发生在事务(transaction)中。  IndexedDB API提供了索引(indexes), 表(tables), 指针(cursors)等等, 但是所有这些必须是依赖于某种事务的。因此,你不能在事务外执行命令或者打开指针。事务(transaction)有生存周期, 在生存周期以后使用它会报错。并且,事务(transaction)是自动提交的,不可以手动提交。
当用户在不同的标签页同时打开Web应用的两个实例时,这个事务模型就会非常有用。如果没有事务操作的支持,这两个实例就会互相影响对方的修改。
IndexedDB API 基本上是异步的
IndexedDB的API不通过return语句返回数据,而是需要你提供一个回调函数来接受数据。执行API时,你不以同步(synchronous)方式对数据库进行“存储”和“读取”操作,而是向数据库发送一个操作“请求”。当操作完成时,数据库会以DOM事件的方式通知你,同时事件的类型会告诉你这个操作是否成功完成。这个过程听起来会有些复杂,但是里面是有明智的原因的。这个和XMLHttpRequest请求是类似的
IndexedDB数据库“请求”无处不在
我们上边提到,数据库“请求”负责接受成功或失败的DOM事件。每一个“请求”都包含onsuccess和onerror事件属性,同时你还对“事件”调用addEventListener()和removeEventListener()。“请求”还包括readyState,result和errorCode属性,用来表示“请求”的状态。result属性尤其神奇,他可以根据“请求”生成的方式变成不同的东西,例如:IDBCursor实例、刚插入数据库的数值对应的键值(key)等。
IndexedDB在结果准备好之后通过DOM事件通知用户
DOM事件总是有一个类型(type)属性(在IndexedDB中,该属性通常设置为success或error)。DOM事件还有一个目标(target)属性,用来告诉事件是被谁触发的。通常情况下,目标(target)属性是数据库操作生成的IDBRequest。成功(success)事件不弹出提示并且不能撤销,错误(error)事件会弹出提示且可以撤销。这一点是非常重要的,因为除非错误事件被撤销,否则他们会终止所在的任何事务。
IndexedDB是面向对象的
IndexedDB不是用二维表来表示集合的关系型数据库。这一点非常重要,将影响你设计和建立你的应用程序。
传统的关系型数据库,你需要用到二维表来存储数据集合(每一行代表一个数据,每一列代表一个属性),IndexedDB有所不同,它要求你为一种数据创建一个对象存储(object Store),只要这种数据一个JavaScript对象即可。每个对象存储都有一个索引(index)集合以方便查询和迭代遍历。
IndexedDB不使用结构化查询语言(SQL)。它通过索引(index)所产生的指针(cursor)来完成查询操作,从而使你可以迭代遍历到结果集合。
IndexedDB遵循同源(same-origin)策略
“源”指脚本所在文档URL的域名、应用层协议和端口。每一个“源”都有与其相关联的数据库。在同一个“源”内的所有数据库都有唯一、可区别的名称。
IndexedDB的安全机制避免应用访问非同“源”的数据。
例如,http://www.webkk.com的应用或页面可以访问http://www.helay.net/blog/的数据,因为他们同“源”。但是它们不能访问http://www.webkk.com:80/blog/(不同端口)或https://www.webkk.com/blog/(不同协议)的数据,因为他们不同“源”。

不过IndexedDB也有局限性,一下一些情况就不合适使用IndexedDB

  • 全球多种语言混合存储,国际化支持不好,需要自己处理;
  • 和服务器端数据库同步,你得自己写同步代码;
  • 全文搜索。

另外的,这些情况数据库可能会被清除

  • 用户请求清除数据;
  • 浏览器处于隐私模式。最后退出浏览器的时候,数据会被清除;
  • 硬盘等存储设备的容量到限;
  • 不正确的;
  • 不完整的改变。

上一篇: 没有了

下一篇:监听页面是否获取状态应用实例

猜你喜欢
利特弗雷自然保护区内的雄性长尾巧织雀;南非
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼。 “Bible”是圣经,有权威的书,我们的本意就是为开发者提供真正有用的的资料。 我的电子邮件1217179982@qq.com,您在开发过程中遇到任何问题,欢迎与我联系。
Copyright © 2017. All rights reserved. 本站由 Helay 纯手工打造