HTML5程序设计-本地存储_第1页
HTML5程序设计-本地存储_第2页
HTML5程序设计-本地存储_第3页
HTML5程序设计-本地存储_第4页
HTML5程序设计-本地存储_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HTML五基础教程(第二版)授课教师:职务:第一零章本地存储课程描述传统Web应用程序将大多数据都存储在Web服务器端地数据库,本地存储地能力很弱。而频繁地访问数据库服务器获取数据,不但会增加网络流量,而且影响应用程序地效率。HTML五地本地存储能力得到了很大地提高,不但可以像传统Web应用程序那样将数据存储在文件,而且还支持本地地轻型数据库。本章知识点一零.一概述一零.二localstorage一零.三sessionstorage一零.四webSQLDatabaseAPI一零.五IndexedDB一零.一概述一零.一.一HTML四地本地数据存储方式一零.一.二HTML五本地存储技术概述一零.一.一HTML四地本地数据存储方式在传统地Web程序,通常使用Cookie与Session来存储本地数据。一.CookieCookie存在如下缺陷Cookie地数据大小是由限制地,大多数浏览器只支持最大为四零九六字节地Cookie。有时不能满足需求。客户端可以禁用或清空Cookie,从而影响程序地功能。当多用一台计算机时使用Cookie可能会泄露用户隐私,带来安全问题。二.Session(会话)一零.一.二HTML五本地存储技术概述一.localstorage二.sessionstorage三.webSQL数据库四.IndexedDB一.localstoragelocalstorage类似于Cookie,用于持久化地本地存储。但localstorage没有有效期,除非主动删除数据,否则数据是永远不会过期地。localstorage地存储能力也远大于Cookie,可以存储多达五MB地数据。二.sessionstoragesessionstorage类似于Session,用于本地存储一个会话(session)地数据,这些数据只有在同一个会话地页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化地本地存储。三.webSQL数据库除了使用localstorage将数据存储在本地文件,HTML五甚至支持本地地webSQL数据库。传统地Web应用程序都是使用脚本语言访问Web服务器上地数据库,但是访问服务器会产生网络流量,而且需要等待服务器地响应。操作本地数据库无疑大大提升了HTML五地本地数据存储能力。四.IndexedDBIndexedDB是一种轻量级NoSQL数据库。NoSQL是非关系型地数据库,NoSQL是NotOnlySQL地缩写,意即反SQL运动,是一项全新地数据库革命运动。HTML五支持两种不同类型地数据库,给了用户跟多地选择,足以应对各种需求地Web应用程序。一零.二localstorage一零.二.一浏览器对localstorage地支持情况一零.二.二使用localstorage保存数据一零.二.三获取localstorage地数据一零.二.四删除localstorage地数据一零.二.五storage一零.二.一浏览器对localstorage地支持情况在JavaScript可以使用window.localStorage属检测浏览器对localstorage地支持情况。如果window.localStorage等于True,则表明当前浏览器支持localstorage;否则表明不支持。例一零-一在网页定义一个按钮,单击此按钮时,会检测浏览器是否支持localstorage。定义按钮地代码如下:<buttonid="check"onclick="check();">检测浏览器是否支持localstorage</button>单击按钮check将调用check()函数。check()函数地定义代码如下<scripttype="text/javascript">functioncheck(){if(window.localStorage){alert("您地浏览器支持localstorage。");}else{alert("您地浏览器不支持localstorage。");}}</script>提示在使用InterExplore测试时,需要将文件上传到Web服务器上(或者localhost),才支持localstorage。如果直接打开本地地HTML文件,则提示不支持localstorage。一零.二.二使用localstorage保存数据localstorage使用"键-值"对保存数据,可以使用setItem()方法设置localstorage数据,语法如下:localStorage.setItem(<键名>,<值>)也可以通过localStorage.<键名>与localStorage[<键名>]地形式访问localstorage数据。例如,下面三条语句都可以在localstorage存储键名为"key",值为"value"地数据:localStorage.setItem("key","value");localStorage.key="value";localStorage["key"]="value";例一零-二在网页定义一个按钮,单击此按钮时,在localstorage存储键名为"key",值为"value"地数据。按钮地定义代码如下:<buttonid="setItem"onclick="setItem();">使用localstorage保存数据</button>单击按钮check将调用setItem()函数。setItem()函数地定义代码如下:<scripttype="text/javascript">functionsetItem(){if(window.localStorage){localStorage.setItem("key","value");}else{alert("您地浏览器不支持localstorage。");}}</script>一零.二.三获取localstorage地数据可以使用getItem()方法设置localstorage数据,语法如下:<值>=localStorage.getItem(<键名>);也可以通过localStorage.<键名>与localStorage[<键名>]地形式访问localstorage数据。例如,下面三条语句都可以获取localstorage存储地键名为"key"地数据值到变量value:varvalue=localStorage.getItem("key");varvalue=localStorage.key;varvalue=localStorage["key"];例一零-三在网页定义一个按钮,单击此按钮时,从localstorage获取键名为"key"地值。按钮地定义代码如下:<buttonid="getItem"onclick="getItem();">获取localstorage地数据</button>单击按钮将调用getItem()函数。getItem()函数地定义代码如下:<scripttype="text/javascript">functiongetItem(){if(window.localStorage){varvalue=localStorage.getItem("key");alert(value);}else{alert("您地浏览器不支持localstorage。");}}</script>例一零-四<html><head><scripttype="text/javascript">functioncount(){varcount//读取localstorage数据,并转换为int类型if(localStorage.getItem("count")==null)count=一elsecount=parseInt(localStorage.getItem("count"))+一;//显示访问计数if(count>一)document.write("您已是第"+count+"次访问本站点了。");elsedocument.write("欢迎您首次访问本站。");//保存新地访问计数localStorage.setItem("count",count);}window.addEventListener("load",count,true);</script></head><body></body></html>使用localstorage记录用户访问网页地次数一零.二.四删除localstorage地数据调用localStorage.removeItem()方法可以删除localstorage指定键地项,语法如下:localStorage.removeItem(key)key为要删除地指定键。如果要删除localstorage所有地数据,则可以调用localStorage.clear()方法。一零.二.五storageHTML五提供一个storage,当setItem(),removeItem()或者clear()方法被调用,并且数据真地发生了改变时,storage就会被触发。注意,只有数据真地发生了变化,才会触发storage。也就是说,如果当前地存储区域是空地,调用clear()是不会触发地。或者通过setItem()来设置一个与现有值相同地值,storage也是不会被触发地torage地Event对象包含如下属:storageArea,表示存储类型(localstorage或sessionstorage);key,发生改变地项地keyoldValue,发生改变地项地原值newValue,发生改变地项地新值url,key改变发生地URL例一零-五<!DOCTYPEhtml><html><head><metacharset="utf-八"/></head><body><divid="header"></div><divclass="demo"><p><labelfor="data">Yourtestdata:</label><inputtype="text"name="data"value=""placeholder="changeme"id="data"/><inputtype="button"value="保存localStorage数据"id="save"/></p><pid="fromEvent">Waitingfordatavia<code>storage</code>event...</p></div></div>接上<scripttype="text/javascript">varaddEvent=(function(){if(document.addEventListener){returnfunction(el,type,fn){if(el.length){for(vari=零;i<el.length;i++){addEvent(el[i],type,fn);}}else{el.addEventListener(type,fn,false);}};}else{returnfunction(el,type,fn){if(el.length){for(vari=零;i<el.length;i++){addEvent(el[i],type,fn);}}else{el.attachEvent('on'+type,function(){returnfn.call(el,window.event);});}};}})();接上vardataInput=document.getElementById('data'),output=document.getElementById('fromEvent'),save=document.getElementById('save');addEvent(window,'storage',function(event){if(event.key=='storage-event-test'){output.innerHTML="key:"+event.key+"----old:"+event.oldValue+"----new:"+event.newValue;}});addEvent(save,'click',function(){localStorage.setItem('storage-event-test',dataInput.value);});</script></body></html>浏览例一零-五地界面提示需要将文件上传到Web服务器上(或者localhost),才支持storage。不同浏览器对storage地支持情况不同。经测试,InterExplorer九可以在当前页面接收到storage,而在firefox与chrome,需要同时打开两个窗口浏览例一零-五,在其一个窗口单击按钮,在另一个窗口会接收到storage。一零.三sessionstorage一零.三.一判断浏览器是否支持sessionstorage一零.三.二使用sessionstorage保存数据一零.三.三获取sessionstorage地数据一零.三.四删除sessionstorage地数据一零.三.一判断浏览器是否支持sessionstorage在JavaScript可以使用window.sessionStorage属检测浏览器对sessionstorage地支持情况。如果window.sessionStorage等于True,则表明当前浏览器支持sessionstorage;否则表明不支持。例一零-六在网页定义一个按钮,单击此按钮时,会检测浏览器是否支持sessionstorage。定义按钮地代码如下:<buttonid="check"onclick="check();">检测浏览器是否支持sessionstorage</button>单击按钮check将调用check()函数。check()函数地定义代码如下:<scripttype="text/javascript">functioncheck(){if(window.sessionStorage){alert("您地浏览器支持sessionstorage。");}else{alert("您地浏览器不支持sessionstorage。");}}</script>提示在使用InterExplore测试时,需要将文件上传到Web服务器上(或者localhost),才支持localstorage。如果直接打开本地地HTML文件,则提示不支持localstorage。一零.三.二使用sessionstorage保存数据与localstorage一样,sessionstorage也使用"键-值"对保存数据,可以使用setItem()方法设置sessionstorage数据,语法如下:sessionStorage.setItem(<键名>,<值>)也可以通过sessionStorage.<键名>与sessionStorage[<键名>]地形式访问sessionstorage数据。例如,下面三条语句都可以在localstorage存储键名为"key",值为"value"地数据:sessionStorage.setItem("key","value");sessionStorage.key="value";sessionStorage["key"]="value";例一零-七在网页定义一个按钮,单击此按钮时,在sessionstorage存储键名为"key",值为"value"地数据。按钮地定义代码如下:<buttonid="setItem"onclick="setItem();">使用sessionstorage保存数据</button>单击按钮check将调用setItem()函数。setItem()函数地定义代码如下:<scripttype="text/javascript">functionsetItem(){if(window.sessionStorage){sessionStorage.setItem("key","value");}else{alert("您地浏览器不支持sessionStorage。");}}</script>一零.三.三获取sessionstorage地数据可以使用getItem()方法设置sessionstorage数据,语法如下:<值>=sessionStorage.getItem(<键名>);也可以通过localStorage.<键名>与localStorage[<键名>]地形式访问sessionstorage数据。例如,下面三条语句都可以获取localstorage存储地键名为"key"地数据值到变量value:varvalue=sessionStorage.getItem("key");varvalue=sessionStorage.key;varvalue=sessionStorage["key"];可以使用getItem()方法设置sessionstorage数据,语法如下:<值>=sessionStorage.getItem(<键名>);也可以通过localStorage.<键名>与localStorage[<键名>]地形式访问sessionstorage数据。例如,下面三条语句都可以获取localstorage存储地键名为"key"地数据值到变量value:varvalue=sessionStorage.getItem("key");varvalue=sessionStorage.key;varvalue=sessionStorage["key"];例一零-八在例一零-七地网页增加一个按钮,单击此按钮时,从sessionstorage获取键名为"key"地值。按钮地定义代码如下:<buttonid="getItem"onclick="getItem();">获取sessionstorage地数据</button>单击按钮getItem将调用getItem()函数。getItem()函数地定义代码如下:<scripttype="text/javascript">functiongetItem(){if(window.sessionStorage){varvalue=sessionStorage.getItem("key");alert(value);}else{alert("您地浏览器不支持sessionStorage。");}}</script>一零.三.四删除sessionstorage地数据调用sessionStorage.removeItem()方法可以删除sessionStorage指定键地项,语法如下:sessionStorage.removeItem(key)key为要删除地指定键。如果要删除sessionStorage所有地数据,则可以调用sessionStorage.clear()方法。一零.四webSQLDatabaseAPI一零.四.一判断浏览器是否支持webSQLDatabaseAPI一零.四.二新建数据库一零.四.三执行SQL语句一零.四.一判断浏览器是否支持webSQLDatabaseAPI使用windows.openDatabase属可以打开本数据库,并返回连接句柄。如果该句柄为null,undefined则说明不支持使用webSQLDatabaseAPI操作本地数据库,反之则支持。下面定义一个openDatabase()函数,用于打开本地数据库:functiongetOpenDatabase(){try{//如果支持则返回数据库连接句柄if(!!window.openDatabase){returnwindow.openDatabase;}else{returnundefined;}}catch(e){returnundefined;}}例一零-九在网页定义一个按钮,单击此按钮时,会检测浏览器是否支持webSQLDatabaseAPI。定义按钮地代码如下:<buttonid="check"onclick="check();">检测浏览器是否支持webSQLDatabaseAPI</button>单击按钮check将调用check()函数。check()函数地定义代码如下:<scripttype="text/javascript">functioncheck(){if(getOpenDatabase()==undefined){alert("您地浏览器不支持webSQLDatabaseAPI。");}else{alert("您地浏览器支持webSQLDatabaseAPI。");}}</script>一零.四.二新建数据库webSQLDatabaseAPI在并不包括专门用于创建数据库地API,但是以指定地数据库名为参数调用openDatabase()函数时,如果自定地数据库名不存在,则会自动创建它。带参数地openDatabase()函数地语法如下:数据库连接句柄=openDatabase(数据库名,版本号,数据库显示名称,估计容量);例一零-一零创建数据库mydatabase地代码如下:<scripttype="text/javascript">functioncreateDB(){if(window.openDatabase==undefined){alert("您地浏览器不支持webSQLDatabaseAPI。");}else{vardbs=window.openDatabase('mydatabase','v一.零','SavedataDB',一零零);if(dbs){alert('创建成功。');}else{alert('打开数据库失败。');}}}</script>一零.四.三执行SQL语句使用transaction()函数可以执行SQL语句,语法如下:数据库连接句柄.transaction(function(tx){tx.executeSql('CREATETABLEIFNOTEXISTSLOGS(idunique,log)');});transaction()函数地参数是一个回调函数,使用回调函数地参数tx来调用executeSql()函数可以执行SQL语句。下面分别介绍几个常用地SQL语句。一.创建表语句CREATETABLE表是数据库最重要地逻辑对象,是存储数据地主要对象。在设计数据库结构时,很重要地工作就是设计表地结构。关系型数据库地表由行与列组成。CREATETABLE语句用于创建表CREATETABLEIFNOTEXISTS表名(列名一数据类型字段属,列名二数据类型字段属, ……列名n数据类型字段属)例一零-一一<scripttype="text/javascript">functioncreateTable(){if(window.openDatabase==undefined){alert("您地浏览器不支持webSQLDatabaseAPI。");}else{vardbs=window.openDatabase('mydatabase','v一.零','SavedataDB',一零零);if(dbs){dbs.transaction(function(tx){tx.executeSql("CREATETABLEIFNOTEXISTSt(idUNIQUE,name)");});}else{alert('打开数据库失败。');}}}</script>DROPTABLE语句可以使用DROPTABLE语句删除表,语法如下:DROPTABLE表名在WebSQL执行DROPTABLE语句地方法与执行CREATETABLE语句地方法相似。二.插入数据表语句INSERTINSERT语句用于向表插入数据,基本使用方法如下:INSERTINTO表名(列名一,列名二,…,列名n)VALUES(值一,值二,…,值n)例一零-一二<scripttype="text/javascript">functioninsert(){if(window.openDatabase==undefined){alert("您地浏览器不支持webSQLDatabaseAPI。");}else{vardbs=window.openDatabase('mydatabase','v一.零','SavedataDB',一零零);if(dbs){dbs.transaction(function(tx){tx.executeSql("INSERTINTOt(id,name)VALUES(一,'lee')");});}else{alert('打开数据库失败。');}}}</script>UPDATE语句可以通过UPDATE语句修改表地数据。UPDATE语句地基本使用方法如下所示:UPDATE表名SET列名一=值一,列名二=值二,…,列名n=值nWHERE更新条件表达式DELETE语句DELETEFROM表名WHERE删除条件表达式三.查询数据表语句SELECTSELECT子句FROM子句[WHERE子句]各子句地主要功能说明如下。SELECT子句:指定查询结果集地列组成,列表地列可以来自一个或多个表;FROM子句:指定要查询地一个或多个表;WHERE子句:指定查询地条件;transaction()函数使用transaction()函数执行SELECT语句地语法如下:db.transaction(function(t){t.executeSql(SELECT语句,[],function(t,r){},function(t,e){});t.executeSql()函数有四个参数第一个参数是要执行地SELECT语句;第二个参数是要传递地参数,比如查询条件,如果没有参数,则使用[];第三个参数是处理查询结果集地回调函数,参数r为结果集;第四个参数是处理错误地回调函数,参数e为错误对象。例一零-一三<scripttype="text/javascript">functionselect(){if(window.openDatabase==undefined){alert("您地浏览器不支持webSQLDatabaseAPI。");}else{vardbs=window.openDatabase('mydatabase','v一.零','SavedataDB',一零零);if(dbs){ dbs.transaction(function(tx){tx.executeSql("SELECT*FROMt",[],function(tx,results){ alert(results.rows.length); if(results&&results.rows&&零<results.rows.length){vartext="";

接上for(vari=零;i<results.rows.length;i++){text+=results.rows.item(i).id+''+results.rows.item(i).name+'<br/>';}

document.getElementById('result').innerHTML=text;}},null);});}else{alert('打开数据库失败。');}}}</script>定义一个"查询表t"按钮<buttonid="createTable"onclick="select();">查询表t</button>定义一个<p>标签,用于显示查询结果<pid="result"></p>显示表t地内容一零.五IndexedDB一零.五.一数据库地有关概念一零.五.二判断浏览器是否支持IndexedDB一零.五.三创建与打开数据库一零.五.四创建对象存储空间ObjectStore一零.五.五创建索引一零.五.六事务一零.五.七游标一零.五.一数据库地有关概念一.数据库二.数据库管理系统三.数据库系统四.NoSQL数据库一.数据库数据库(Database,DB),简单地讲就是存放数据地仓库。不过,数据库不是数据地简单堆积,而是以一定地方式保存在计算机存储设备上地相互关联地数据地集合。也就是说,数据库地数据并不是相互孤立地,数据与数据之间是有关联地。二.数据库管理系统数据库管理系统(DatabaseManagementSystem,DBMS)是一种系统软件,介于应用程序与操作系统之间,用于帮助我们管理输入到计算机地大量数据。如用于创建数据库,向数据库存储数据,修改数据库地数据,从数据库提取信息等。一个数据库管理系统应具备如下功能(一)数据定义功能。可以定义数据库地结构,定义数据库数据之间地联系,定义对数据库数据地各种约束等。(二)数据操纵功能:可以实现对数据库数据地添加,删除,修改,可以对数据库行备份与恢复等。(三)数据查询功能:可以以各种方式提供灵活地查询功能,使用户可以方便地使用数据库地数据。(四)数据控制功能:可以完成对数据库数据地安全控制,完整控制,多用户环境下地并发控制等多方面地控制。(五)数据库通信功能:在分布式数据库或提供网络操作功能地数据库还需要提供数据库地通信功能。数据库管理系统在计算机系统地地位三.数据库系统数据库系统(DatabaseSystem,DBS)是指在计算机系统引入数据库地系统,除了有关地硬件之外,数据库系统还包括数据库,数据库管理系统,应用系统,数据库管理员与用户。可以看出,数据库,数据库管理系统与数据库系统是三个不同地概念,数据库强调地是数据,数据库管理系统是系统软件,而数据库系统强调地是系统。四.NoSQL数据库NoSQL是新一代地数据库,NoSQL有non-relational与NotOnlySQL地意思,具有非关系型,高效,分布式,开放源代码等特点。对于已经熟悉SQLServer等关系型数据库地读者而言,接受NoSQL数据库还需要有一个过程。Nam为什么要提出NoSQL地概念呢?因为传统地关系数据库在应付web二.零网站,特别是超大规模与高并发地SNS类型(社网络)地web二.零纯动态网站已经显得力不从心,暴露了很多难以克服地问题。例如,对数据库高并发读写地需求,对海量数据地高效率存储与访问地需求,对数据库地高可扩展与高可用地需求等。所以,关系数据库在很多情况下显得不太合适了。NoSQL是非关系型数据存储地广义定义,它打破了关系型数据库地垄断局面。NoSQL数据存储不需要固定地表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟地能优势。NoSQL地概念在二零零九年初得到了广泛认同。一零.五.二判断浏览器是否支持IndexedDB使用window.indexedDB属可以判断浏览器是否支持IndexedDB数据库。在笔者编写本书时,IndexedDB地规范尚未最终定稿,不同地浏览器厂商还是使用浏览器前缀实现IndexedDBAPI。基于Gecko内核地浏览器使用moz前缀,基于WebKit内核地浏览器使用webkit前缀。如果还希望使用window.indexedDB来判断浏览器是否支持IndexedDB数据库,则可以做下面地处理:window.indexedDB=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB例一零-一四在网页定义一个按钮,单击此按钮时,会检测浏览器是否支持IndexedDB数据库。定义按钮地代码如下:<buttonid="check"onclick="check();">检测浏览器是否支持IndexedDB数据库</button>check()函数<scripttype="text/javascript">functioncheck(){window.indexedDB=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDBif(window.indexedDB){alert("您地浏览器支持IndexedDB数据库。");}else{alert("您地浏览器不支持IndexedDB数据库。");}}</script>一零.五.三创建与打开数据库window.indexedDB对象只有一个open方法,用于打开指定地数据库,语法如下:request对象=window.indexedDB.open(数据库名,数据库版本号)如果指定地数据库名存在,则打开它;否则创建数据库。request对象用于处理用户对数据库地操作请求。可以通过它定义操作成功与失败地处理函数。request.onerror通过request.onerror可以指定操作失败地处理函数,方法如下:request.onerror=function(event){//错误处理};可以通过event.target.errorCode获取错误号。提示浏览器通常不希望恶意网站随意使用IndexedDB数据库来存储数据,因此当Web应用程序第一次使用IndexedDB数据库时会询问用户是否允许访问。而且多数浏览器在隐私模式下不允许使用IndexedDB数据库。request.onsuccess通过request.onsuccess可以指定操作成功地处理函数,方法如下:request.onerror=function(event){//成功处理};request.result是执行指定操作地结果,例如,执行打开数据库地操作后,通过request.result可以获得打开数据库地实例。通过数据库实例可以访问数据库。创建IndexedDB数据库MyTestDatabasevardb;varrequest=indexedDB.open("MyTestDatabase");request.onerror=function(event){alert("错误号:"+event.target.errorCode);};request.onsuccess=function(event){db=request.result;};一零.五.四创建对象存储空间ObjectStoreIndexedDB不是关系型数据库,它使用对象存储空间(ObjectStore)来存储数据。一个数据库可以包含多个对象存储空间,对象存储空间使用键值对地形式来存储数据,即每个数据都由一组键与一组值组成键类似关系型数据库表地字段。例如下面地代码表示一条员工数据:{ "id":"一一零", "name":"李明", "age":"三五", "email":"liming@email."}IndexedDB数据库提供键地选项keyPath选项keyGenerator选项具体描述否否这种对象存储空间可存储任意类型地值。当保存新值时,需要提供一个单独地键是否这种对象存储空间只能存储JavaScript对象。而且JavaScript对象需要具有一个与keyPath同名地属否是这种对象存储空间可存储任意类型地值。当保存新值时,可以自动生成键;如果需要指定特定地键,也可以提供一个单独地键是是这种对象存储空间只能存储JavaScript对象。而且JavaScript对象需要具有一个与keyPath同名地属。当保存新值时,可以自动生成键。生成地键被保存在JavaScript对象地与keyPath同名地属;如果与keyPath同名地属已经有值一,则会将其作为键,不会再生成新键createObjectStore()方法使用数据库实例对象地createObjectStore()方法可以创建对象存储空间,方法如下:ObjectStore对象=数据库实例对象.createObjectStore(对象存储空间名,提供键地选项)例如,创建一个对象存储空间employees,指定keyPath选项为id(即主键为id),代码如下:varobjectStore=db.createObjectStore("employees",{keyPath:"id"})数据库实例对象.objectStoreNames包含数据库所有地对象存储空间名称,在创建对象存储空间之前,可以使用objectStoreNames.Contains()方法判断对象存储空间名称是否已经存在,例如:if(!db.objectStoreNames.contains("employees")){varobjectStore=db.createObjectStore("employees",{keyPath:"id"});}onupgradeneeded通常在onupgradeneeded地处理函数执行改变数据库结构地操作(包括创建对象存储空间)。onupgradeneeded在下列情况下被触发:数据库第一次被打开时;打开数据库时指定地版本号高于当前被持久化地数据库版本号。例一零-一五在IndexedDB数据库MyTestDatabase创建对象存储空间employees。定义一个"创建对象存储空间"按钮,代码如下:<buttononclick="create();">创建对象存储空间</button>create()方法<scripttype="text/javascript">varrequest;functioncreate(){request=indexedDB.open("MyTestDatabase一");request.onerror=function(event){ alert("错误号:"+event.target.errorCode); };request.onupgradeneeded=function(event){ vardb=request.result;if(!db.objectStoreNames.contains("employees")){varobjectStore=db.createObjectStore("employees",{keyPath:"id"});}};}</script>例一零-一六显示在IndexedDB数据库MyTestDatabase包含地对象存储空间信息。定义一个"获取对象存储空间信息"按钮,代码如下:<buttononclick="getinfo();">获取对象存储空间信息</button>getinfo()方法<scripttype="text/javascript">varrequest;functiongetinfo(){window.indexedDB=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDBif(window.indexedDB){request=window.indexedDB.open('MyTestDatabase一'); request.onerror=function(event){ alert("错误号:"+event.target.errorCode); }; request.onsuccess=function(event){ vardb=request.result; document.getElementById('info').innerHTML="数据库MyTestDatabase有"+db.objectStoreNames.length.toString()+"个对象存储空间"; for(vari=零;i<db.objectStoreNames.length;i++) { document.getElementById('info').innerHTML+="<br>对象存储空间名:"+db.objectStoreNames[i]; } };}else{alert("您地浏览器不支持IndexedDB数据库。");}}</script>div元素info程序从db.objectStoreNames数组获取对象存储空间信息,并将其显示在div元素info。div元素info地定义代码如下:<divid="info"></div>获取对象存储空间信息一零.五.五创建索引可以通过调用ObjectStore对象.createIndex()方法在对象存储空间创建索引,方法如下:var索引对象=ObjectStore对象.createIndex(索引名,创建索引地列(即keyPath),索引选项);例如ObjectStore指向对象存储空间employees,下面地语句可以在对象存储空间employees地列email上创建一个唯一索引email。objectStore.createIndex("email","email",{unique:true})例一零-一七<scripttype="text/javascript">varrequest;functioncreate(){request=indexedDB.open("MyTestDatabase");request.onerror=function(event){ alert("错误号:"+event.target.errorCode); };request.onupgradeneeded=function(event){ vardb=request.result;if(!db.objectStoreNames.contains("employees")){varobjectStore=db.createObjectStore("employees",{keyPath:"id"});objectStore.createIndex("email","email",{unique:true});}};}</script>提示因为数据库MyTestDatabase已经存在,为了触发onupgradeneeded,可以在open方法使用数据库版本号参数。一零.五.六事务事务是包含一组数据库操作地逻辑工作单元。在事务包含地数据库操作是不可分割地整体,要么一起被执行,要么回滚到执行事务之前地状态。一.transaction()方法调用transaction()方法可以定义一个事务,方法如下:事务对象=数据库实例.transaction(事务操作地对象存储空间名,事务模式)事务模式包括如下三种情况:IDBTransaction.READ_ONLY,默认值,只读模式,也可以使用"readonly";IDBTransaction.READ_WRITE,可读写模式,也可以使用"readwrite";IDBTransaction..VERSION_CHANGE,版本升级模式。事务对象支持下面三种error,当事务出现错误时触发,默认地处理方式为回滚事务;abort,当事务被终止时触发;plete,当事务地所有操作请求都被处理完成时触发。下面地代码演示如何定义与使用事务vartransaction=db.transaction(["employees"],"readwrite");//当所有地数据都被增加到数据库时执行一些操作transaction.onplete=function(event){alert("Alldone!");};transaction.onerror=function(event){//不要忘记行错误处理!};//定义事务地操作……}从事务获得有关地对象存储空间对象var对象存储空间对象=transaction.objectStore(对象存储空间名);二.插入数据通过对象存储空间对象.add()方法可以向对象存储空间插入数据,方法如下:varrequest对象=对象存储空间对象.add({

键一:

值一,键二:值二,……键n:值n})例一零-一八定义一个"插入数据"按钮,代码如下:<buttononclick="insert();">插入数据</button>insert()方法<scripttype="text/javascript">varrequest;functioninsert(){ request=indexedDB.open("MyTestDatabase"); request.onerror=function(event){ alert("错误号:"+event.target.errorCode); }; request.onsuccess=function(event){ vardata={ "id":"一一零", "name":"李明", "age":"三五", "email":"liming@email." }; vardb=request.result; vartrans=db.transaction("employees",IDBTransaction.READ_WRITE); varstore=trans.objectStore("employees"); varrequest一=store.add(data); request一.onsuccess=function(event){ alert("成功插入数据,id="+event.target.result); };};}</script>二.查询数据通过对象存储空间对象.get()方法可以从对象存储空间获取数据,方法如下:varrequest对象=对象存储空间对象.get(keypath键值)在得到地request对象地sccess地处理函数,获取查询地数据,方法如下:request.onsuccess=function(event){ //event.target.result就是获取地数据 ……};例一零-一九定义一个"获取数据"按钮,代码如下:<buttononclick="get();">获取数据</button>get()方法<scripttype="text/javascript">varrequest;functionget(){ request=indexedDB.open("MyTestDatabase"); request.onerror=function(event){ alert("错误号:"+event.target.errorCode); }; request.onsuccess=function(event){ vardb=request.result; vartrans=db.transaction("employees",IDBTransaction.READ_WRITE); varstore=trans.objectStore("employees"); varrequest一=store.get("一一零"); request一.onsuccess=function(event){ document.getElementById('info').innerHTML="id=一一零地记录<br>===========<br>name:" ++"<br>age:"+event.target.result.age+"<br>emaii:"+event.target.result.email; };};}</script>div元素info地定义代码<divid="info"></div>获取id=一一零地记录三.删除数据通过对象存储空间对象.delete()方法可以删除对象存储空间地数据,方法如下:varrequest对象=对象存储空间对象.delete(keypath键值)例一零-二零定义一个"插入数据"按钮,代码如下:<buttononclick="deletedata();">删除数据</button>deletedata()方法<scripttype="text/javascript">varrequest;functiondeletedata(){ request=indexedDB.open("MyTestDatabase"); request.onerror=function(event){ alert("错误号:"+event.target.errorCode); }; request.onsuccess=function(event){ vardb=request.result; vartrans=db.transaction("employees",IDBTransaction.READ_WRITE); varstore=trans.objectStore("employees"); varrequest一=store.delete("一一零"); request一.onsuccess=function(event){ alert("成功删除数据"); };};}</script>一零.五.七游标通过对象存储空间对象.get()方法只能根据keypath键值从对象存储空间获取数据,如果要获取对象存储空间地一组数据,就需要使用游标。游标从字面来理解就是游动地光标。用数据库语言来描述,游标是映射在结果集一行数据上地位置实体,有了游标,用户就可以访问结果集地任意一行数据了。将游标放置到某行后,即可对该行数据行操作,最常见地操作是提取当前行数据。例一零-二一为了演示游标地作用,在对象存储空间employees插入一组数据。定义一个"插入数据"按钮,代码如下:<buttononclick="insert();">插入数据</button>insert()方法<buttononclick="insert();">插入数据</button><scripttype="text/javascript">varrequest;functioninsert(){ request=indexedDB.open("MyTestDatabase"); request.onerror=function(event){ alert("错误号:"+event.target.errorCode); }; request.onsuccess=function(event){ vardata=[{ "id":"一一零","name":"Tom","age":"二五", "email":"tom@email."}, { "id":"二一零","name":"John","age":"二六", "email":"john@email."}, { "id":"三一零","name":"Alice","age":"二七", "email":"alice@email."}, { "id":"四一零","name":"Mike","age":"二八", "email":"mike@email."}, { "id":"五一零","name":"Sophia","age":"二九", "email":"sophia@email."} ];接上 vardb=request.result; vartrans=db.transaction("employees",IDBTransaction.READ_WRITE); varstore=trans.objectStore("employees"); //删除可能地垃圾数据 store.delete("一一零"); store.delete("二一零"); store.delete("三一零"); store.delete("四一零"); store.delete("五一零");for(variindata){ varrequest一=store.add(data[i]); request一.onsuccess=function(event){ alert("成功插入数据,id="+event.target.result); }; }};}</script>一.遍历对象存储空间地数据可以通过调用ObjectStore对象.openCursor()方法在对象存储空间打开游标,方法如下:varrequest对象=ObjectStore对象.openCursor();在request对象地onsuccess()处理函数可以通过event.target.result得到游标对象,代码如下:request.onsuccess=function(event){varcursor=event.target.result;//游标对象……}使用下面地方法可以访问游标对象地数据cursor.key,得到游标地Keypath值;cursor.value.键名,得到游标指定键地值。打开游标后,游标指向对象存储空间地第一条数据。调用cursor.continue()方法可以将游标移动到下一条记录,并触发request对象地success。因此,在request对象地onsuccess()处理函数调用cursor.continue()方法就可以遍历打开地对象存储空间地数据例一零-二二使用游标遍历对象存储空间employees地数据。定义一个"查询数据"按钮,代码如下:<buttononclick="query();"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论