1、第第9讲讲 数据库数据库Web SQL传统传统WebWeb应用程序将大多数据都存储在应用程序将大多数据都存储在WebWeb服务服务器端的数据库中,本地存储的能力很弱。器端的数据库中,本地存储的能力很弱。而频繁地访问数据库服务器获取数据,不但会而频繁地访问数据库服务器获取数据,不但会增加网络流量,而且影响应用程序的效率。增加网络流量,而且影响应用程序的效率。HTML5HTML5的本地存储能力得到了很大的提高,不但的本地存储能力得到了很大的提高,不但可以像传统可以像传统WebWeb应用程序那样将数据存储在文件应用程序那样将数据存储在文件中,而且还支持本地的轻型数据库。中,而且还支持本地的轻型数据库
2、。本章知识点本章知识点1 webSQL Database API 1 webSQL Database API 2 IndexedDB 2 IndexedDB 1 webSQL Database API p1 1 判断浏览器是否支持判断浏览器是否支持webSQL Database API webSQL Database API p2 2 新建数据库新建数据库 p3 3 执行执行SQLSQL语句语句 1 判断浏览器是否支持判断浏览器是否支持webSQL Database API p使用使用windows.openDatabasewindows.openDatabase属性可以打开本数据库属性可以打
3、开本数据库,并返回连接句柄。如果该句柄为,并返回连接句柄。如果该句柄为nullnull、undefinedundefined则说明不支持使用则说明不支持使用webSQL Database APIwebSQL Database API操作本地数操作本地数据库,反之则支持。下面定义一个据库,反之则支持。下面定义一个openDatabase()openDatabase()函数,用于打开本地数据库:函数,用于打开本地数据库:function getOpenDatabase()try /如果支持则返回数据库连接句柄 if(!window.openDatabase)return window.openDa
4、tabase;else return undefined;catch(e)return undefined;【例例 9】p在网页中定义一个按钮,单击此按钮时,会检测浏在网页中定义一个按钮,单击此按钮时,会检测浏览器是否支持览器是否支持webSQL Database APIwebSQL Database API。定义按钮的代。定义按钮的代码如下:码如下:检测浏览器是否支持检测浏览器是否支持webSQL Database API【例例 9】p单击按钮单击按钮checkcheck将调用将调用check()check()函数。函数。check()check()函数的函数的定义代码如下:定义代码如下:f
5、unction check()if(getOpenDatabase()=undefined)alert(您的浏览器不支持您的浏览器不支持webSQL Database API。);else alert(您的浏览器支持您的浏览器支持webSQL Database API。);2 新建数据库新建数据库 pwebSQL Database APIwebSQL Database API在中并不包括专门用在中并不包括专门用于创建数据库的于创建数据库的APIAPI,但是以指定的数据库,但是以指定的数据库名为参数调用名为参数调用openDatabase()openDatabase()函数时,如果函数时,如果自
6、定的数据库名不存在,则会自动创建它。自定的数据库名不存在,则会自动创建它。p带参数的带参数的openDatabase()openDatabase()函数的语法如下:函数的语法如下:数据库连接句柄数据库连接句柄=openDatabase(数据数据库名库名,版本号版本号,数据库显示名称数据库显示名称,估计容量估计容量);【例例 10】p创建数据库创建数据库mydatabasemydatabase的代码如下:的代码如下:function createDB()if(window.openDatabase=undefined)alert(您的浏览器不支持您的浏览器不支持webSQL Database A
7、PI。);else var dbs=window.openDatabase(mydatabase,v1.0,Save data DB,100);if(dbs)alert(创建成功。创建成功。);else alert(打开数据库失败。打开数据库失败。);3 执行执行SQL语句语句 p使用使用transaction()transaction()函数可以执行函数可以执行SQLSQL语句,语法如语句,语法如下:下:数据库连接句柄数据库连接句柄.transaction(function(tx)tx.executeSql(CREATE TABLE IF NOT EXISTS LOGS(id unique,
8、log););ptransaction()transaction()函数的参数是一个回调函数,使用函数的参数是一个回调函数,使用回调函数的参数回调函数的参数txtx来调用来调用executeSql()executeSql()函数可以执函数可以执行行SQLSQL语句。下面分别介绍几个常用的语句。下面分别介绍几个常用的SQLSQL语句。语句。1创建表语句创建表语句CREATE TABLE p表是数据库中最重要的逻辑对象,是存储数据表是数据库中最重要的逻辑对象,是存储数据的主要对象。在设计数据库结构时,很重要的的主要对象。在设计数据库结构时,很重要的工作就是设计表的结构。关系型数据库的表由工作就是设
9、计表的结构。关系型数据库的表由行和列组成。行和列组成。CREATE TABLE语句用于创建表语句用于创建表 CREATE TABLE IF NOT EXISTS 表名表名(列名列名1数据类型数据类型 字段属性字段属性,列名列名2数据类型数据类型 字段属性字段属性,列名列名n数据类型数据类型 字段属性字段属性)【例例 11】function createTable()if(window.openDatabase=undefined)alert(您的浏览器不支持您的浏览器不支持webSQL Database API。);else var dbs=window.openDatabase(mydata
10、base,v1.0,Save data DB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(CREATE TABLE IF NOT EXISTS t(id UNIQUE,name););else alert(打开数据库失败。打开数据库失败。);DROP TABLE语句语句 p可以使用可以使用DROP TABLEDROP TABLE语句删除表,语法语句删除表,语法如下:如下:DROP TABLE 表名表名p在在WebSQLWebSQL中执行中执行DROP TABLEDROP TABLE语句的方法语句的方法与执行与执行CREATE TA
11、BLECREATE TABLE语句的方法相似。语句的方法相似。2插入数据表语句插入数据表语句INSERT pINSERTINSERT语句用于向表中插入数据,基本语句用于向表中插入数据,基本使用方法如下:使用方法如下:INSERT INTO 表名表名(列名列名1,列名列名2,列名列名n)VALUES(值值1,值值2,值值n)【例例 12】function insert()if(window.openDatabase=undefined)alert(您的浏览器不支持您的浏览器不支持webSQL Database API。);else var dbs=window.openDatabase(myda
12、tabase,v1.0,Save data DB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(INSERT INTO t(id,name)VALUES(1,lee););else alert(打开数据库失败。打开数据库失败。);UPDATE语句语句 p可以通过可以通过UPDATEUPDATE语句修改表中的数据。语句修改表中的数据。UPDATEUPDATE语句的基本使用方法如下所示:语句的基本使用方法如下所示:UPDATE 表名表名 SET 列名列名1=值值1,列名列名2=值值2,列名列名n=值值nWHERE 更新条件表达式更新条件
13、表达式DELETE语句语句 DELETE FROM 表名表名WHERE 删除条件删除条件表达式表达式3查询数据表语句查询数据表语句SELECT SELECT子句子句FROM 子句子句 WHERE 子句子句 各子句的主要功能说明如下。各子句的主要功能说明如下。SELECTSELECT子句:指定查询结果集的列组成,列子句:指定查询结果集的列组成,列表中的列可以来自一个或多个表;表中的列可以来自一个或多个表;FROMFROM子句:指定要查询的一个或多个表;子句:指定要查询的一个或多个表;WHEREWHERE子句:指定查询的条件;子句:指定查询的条件;transaction()函数函数 p使用使用tr
14、ansaction()transaction()函数执行函数执行SELECTSELECT语句语句的语法如下:的语法如下:db.transaction(function(t)t.executeSql(SELECT语句语句,function(t,r),function(t,e);t.executeSql()函数有函数有4个参数个参数 p第一个参数是要执行的第一个参数是要执行的SELECTSELECT语句;语句;p第第2 2个参数是要传递的参数,比如查询条个参数是要传递的参数,比如查询条件,如果没有参数,则使用件,如果没有参数,则使用;p第第3 3个参数是处理查询结果集的回调函数个参数是处理查询结果
15、集的回调函数,参数,参数r r为结果集;为结果集;p第第4 4个参数是处理错误的回调函数,参数个参数是处理错误的回调函数,参数e e为错误对象。为错误对象。【例例 13】function select()if(window.openDatabase=undefined)alert(您的浏览器不支持您的浏览器不支持webSQL Database API。);elsevar dbs=window.openDatabase(mydatabase,v1.0,Save data DB,100);if(dbs)dbs.transaction(function(tx)tx.executeSql(SELECT
16、*FROM t,function(tx,results)alert(results.rows.length);if(results&results.rows&0 results.rows.length)var text=;接上接上for(var i=0;i results.rows.length;i+)text+=results.rows.item(i).id+results.rows.item(i).name+;document.getElementById(result).innerHTML=text;,null););else alert(打开数据库失败。打开数据库失败。);定义一个定义
17、一个“查询表查询表t”按钮按钮 查询表查询表t定义一个定义一个标签,用于显示查询结果标签,用于显示查询结果 显示表显示表t的内容的内容 总结总结p我们在数据库中处理大量结构化数据,我们在数据库中处理大量结构化数据,html5html5引入引入Web SQL DatabaseWeb SQL Database概念。概念。p它使用它使用 SQL SQL 来操纵客户端数据库的来操纵客户端数据库的 API API,这些,这些 API API 是异步的,规范中使用的方是异步的,规范中使用的方言是言是SQLliteSQLlite。p悲剧正是产生于此,悲剧正是产生于此,Web SQL DatabaseWeb
18、SQL Database规范页面有着这样的声明。规范页面有着这样的声明。p翻译一下:翻译一下:Web SQL DatabaseWeb SQL Database曾经在曾经在W3CW3C推荐规范上推荐规范上,但规范工作已经停止了。,但规范工作已经停止了。p目前已经陷入了一个僵局:目前的所有实现都是基目前已经陷入了一个僵局:目前的所有实现都是基于同一个于同一个SQLSQL后端(后端(SQLiteSQLite),但是我们需要更多的),但是我们需要更多的独立实现来完成标准化。独立实现来完成标准化。p也就是说这是一个废弃的标准了,虽然部分浏览器也就是说这是一个废弃的标准了,虽然部分浏览器已经实现,但。已经
19、实现,但。p但是我们学一下也没什么坏处,而且能和现但是我们学一下也没什么坏处,而且能和现在在W3CW3C力推的力推的IndexedDBIndexedDB做比较。做比较。p不过不过ChromeChrome的控制台真心好用啊,神马的控制台真心好用啊,神马cookiecookie、Local StorageLocal Storage、Session StorageSession Storage、Web SQLWeb SQL、IndexedDBIndexedDB、Application CacheApplication Cache等等html5html5新增内容看的一清二楚,免去了很多新增内容看的一清
20、二楚,免去了很多调试代码工作。调试代码工作。pWeb SQL DatabaseWeb SQL Database实际上已经被废弃,而实际上已经被废弃,而HTML5HTML5的支持的本地存储实际上变成了的支持的本地存储实际上变成了Web StorageWeb Storage(Local StorageLocal Storage和和Session StorageSession Storage)与)与IndexedDBIndexedDB。pWeb StorageWeb Storage使用简单字符串键值对在本地存储使用简单字符串键值对在本地存储数据,方便灵活,但是对于大量结构化数据存数据,方便灵活,但是
21、对于大量结构化数据存储力不从心。储力不从心。pIndexedDBIndexedDB是为了能够在客户端存储大量的结构是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的化数据,并且使用索引高效检索的APIAPI。2 IndexedDB p1 1 数据库的相关概念数据库的相关概念 p2 2 判断浏览器是否支持判断浏览器是否支持IndexedDB IndexedDB p3 3 创建和打开数据库创建和打开数据库 p4 4 创建对象存储空间创建对象存储空间ObjectStore ObjectStore p5 5 创建索引创建索引 p6 6 事务事务 p7 7 游标游标 1 数据库的相关概念数据
22、库的相关概念 p1 1数据库数据库 p2 2数据库管理系统数据库管理系统 p3 3数据库系统数据库系统 p4 4NoSQLNoSQL数据库数据库 1数据库数据库 p数据库(数据库(DatabaseDatabase,DBDB),简单地讲就),简单地讲就是存放数据的仓库。不过,数据库不是是存放数据的仓库。不过,数据库不是数据的简单堆积,而是以一定的方式保数据的简单堆积,而是以一定的方式保存在计算机存储设备上的相互关联的数存在计算机存储设备上的相互关联的数据的集合。也就是说,数据库中的数据据的集合。也就是说,数据库中的数据并不是相互孤立的,数据和数据之间是并不是相互孤立的,数据和数据之间是有关联的。
23、有关联的。2数据库管理系统数据库管理系统 p数据库管理系统(数据库管理系统(Database Management Database Management SystemSystem,DBMSDBMS)是一种系统软件,介于)是一种系统软件,介于应用程序和操作系统之间,用于帮助我应用程序和操作系统之间,用于帮助我们管理输入到计算机中的大量数据。如们管理输入到计算机中的大量数据。如用于创建数据库,向数据库中存储数据用于创建数据库,向数据库中存储数据,修改数据库中的数据,从数据库中提,修改数据库中的数据,从数据库中提取信息等。取信息等。一个数据库管理系统应具备如下功能一个数据库管理系统应具备如下功能
24、p(1 1)数据定义功能。可以定义数据库的结构,定义数)数据定义功能。可以定义数据库的结构,定义数据库中数据之间的联系,定义对数据库中数据的各种据库中数据之间的联系,定义对数据库中数据的各种约束等。约束等。p(2 2)数据操纵功能:可以实现对数据库中数据的添加)数据操纵功能:可以实现对数据库中数据的添加、删除、修改,可以对数据库进行备份和恢复等。、删除、修改,可以对数据库进行备份和恢复等。p(3 3)数据查询功能:可以以各种方式提供灵活的查询)数据查询功能:可以以各种方式提供灵活的查询功能,使用户可以方便地使用数据库中的数据。功能,使用户可以方便地使用数据库中的数据。p(4 4)数据控制功能:
25、可以完成对数据库中数据的安全)数据控制功能:可以完成对数据库中数据的安全性控制、完整性控制、多用户环境下的并发控制等多性控制、完整性控制、多用户环境下的并发控制等多方面的控制。方面的控制。p(5 5)数据库通信功能:在分布式数据库或提供网络操)数据库通信功能:在分布式数据库或提供网络操作功能的数据库中还必须提供数据库的通信功能。作功能的数据库中还必须提供数据库的通信功能。数据库管理系统在计算机系统中的地位数据库管理系统在计算机系统中的地位 硬件 操 系 统 作 D B M S 应 用 开 发 工 具 应 用 系 统 3数据库系统数据库系统 p数据库系统(数据库系统(Database Syste
26、mDatabase System,DBSDBS)是指在计算机系统中引入数据库的系统是指在计算机系统中引入数据库的系统,除了相关的硬件之外,数据库系统还,除了相关的硬件之外,数据库系统还包括数据库、数据库管理系统、应用系包括数据库、数据库管理系统、应用系统、数据库管理员和用户。统、数据库管理员和用户。p可以看出,数据库、数据库管理系统和可以看出,数据库、数据库管理系统和数据库系统是数据库系统是3 3个不同的概念,数据库强个不同的概念,数据库强调的是数据,数据库管理系统是系统软调的是数据,数据库管理系统是系统软件,而数据库系统强调的是系统。件,而数据库系统强调的是系统。4NoSQL数据库数据库 p
27、NoSQLNoSQL是新一代的数据库,是新一代的数据库,NoSQLNoSQL有有non-relationalnon-relational和和Not Only SQLNot Only SQL的意思,具有非关系型、高效、分的意思,具有非关系型、高效、分布式、开放源代码等特点。对于已经熟悉布式、开放源代码等特点。对于已经熟悉SQL SQL ServerServer等关系型数据库的读者而言,接受等关系型数据库的读者而言,接受NoSQLNoSQL数据数据库还需要有一个过程。库还需要有一个过程。Nam为什么要提出为什么要提出NoSQL的概念呢?的概念呢?p因为传统的关系数据库在应付因为传统的关系数据库在应
28、付web2.0web2.0网站,特别是超大网站,特别是超大规模和高并发的规模和高并发的SNSSNS类型(社交网络)的类型(社交网络)的web2.0web2.0纯动态网纯动态网站已经显得力不从心,暴露了很多难以克服的问题。站已经显得力不从心,暴露了很多难以克服的问题。p例如,对数据库高并发读写的需求、对海量数据的高效例如,对数据库高并发读写的需求、对海量数据的高效率存储和访问的需求、对数据库的高可扩展性和高可用率存储和访问的需求、对数据库的高可扩展性和高可用性的需求等。性的需求等。p所以,关系数据库在很多情况下显得不太合适了。所以,关系数据库在很多情况下显得不太合适了。NoSQL NoSQL 是
29、非关系型数据存储的广义定义,它打破了关系型数据是非关系型数据存储的广义定义,它打破了关系型数据库的垄断局面。库的垄断局面。NoSQL NoSQL 数据存储不需要固定的表结构,数据存储不需要固定的表结构,通常也不存在连接操作。通常也不存在连接操作。p在大数据存取上具备关系型数据库无法比拟的性能优势在大数据存取上具备关系型数据库无法比拟的性能优势。NoSQLNoSQL的概念在的概念在 20092009年初得到了广泛认同。年初得到了广泛认同。2 判断浏览器是否支持判断浏览器是否支持IndexedDB p使用使用window.indexedDBwindow.indexedDB属性可以判断浏览器是否支属
30、性可以判断浏览器是否支持持IndexedDBIndexedDB数据库。数据库。p当前,当前,IndexedDBIndexedDB的规范尚未最终定稿,不同的浏览的规范尚未最终定稿,不同的浏览器厂商还是使用浏览器前缀实现器厂商还是使用浏览器前缀实现IndexedDB APIIndexedDB API。基。基于于GeckoGecko内核的浏览器使用内核的浏览器使用mozmoz前缀,基于前缀,基于WebKitWebKit内内核的浏览器使用核的浏览器使用webkitwebkit前缀。前缀。p如果还希望使用如果还希望使用window.indexedDBwindow.indexedDB来判断浏览器是来判断浏
31、览器是否支持否支持IndexedDBIndexedDB数据库,则可以做下面的处理:数据库,则可以做下面的处理:window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDB【例例 14】p在网页中定义一个按钮,单击此按钮时在网页中定义一个按钮,单击此按钮时,会检测浏览器是否支持,会检测浏览器是否支持IndexedDBIndexedDB数据数据库。定义按钮的代码如下:库。定义按钮的代码如下:检测浏览器是否支持检测浏览器是否支持IndexedDB数据库数据库check()函数函数 function check
32、()window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDB if(window.indexedDB)alert(您的浏览器支持您的浏览器支持IndexedDB数据库。数据库。);else alert(您的浏览器不支持您的浏览器不支持IndexedDB数据库。数据库。);3 创建和打开数据库创建和打开数据库 p window.indexedDBwindow.indexedDB对象只有一个对象只有一个openopen方法,用于方法,用于打开指定的数据库,语法如下:打开指定的数据库,语法如下:reque
33、st对象对象=window.indexedDB.open(数据库名数据库名,数据库版本号数据库版本号)p 如果指定的数据库名存在,则打开它;否则创建如果指定的数据库名存在,则打开它;否则创建数据库。数据库。requestrequest对象用于处理用户对数据库的操对象用于处理用户对数据库的操作请求。可以通过它定义操作成功和失败的处理作请求。可以通过它定义操作成功和失败的处理函数。函数。request.onerror p通过通过request.onerrorrequest.onerror可以指定操作失败的可以指定操作失败的处理函数,方法如下:处理函数,方法如下:request.onerror=fu
34、nction(event)/错误处理错误处理;p可以通过可以通过event.target.errorCodeevent.target.errorCode获取错获取错误号。误号。提示提示 p浏览器通常不希望恶意网站随意使用浏览器通常不希望恶意网站随意使用IndexedDBIndexedDB数据库来存储数据,因此当数据库来存储数据,因此当WebWeb应应用程序第一次使用用程序第一次使用IndexedDBIndexedDB数据库时会询问数据库时会询问用户是否允许访问。用户是否允许访问。p而且多数浏览器在隐私模式下不允许使用而且多数浏览器在隐私模式下不允许使用IndexedDBIndexedDB数据库
35、。数据库。request.onsuccess p通过通过request.onsuccessrequest.onsuccess可以指定操作成功的可以指定操作成功的处理函数,方法如下:处理函数,方法如下:request.onerror=function(event)/成功处理成功处理;prequest.resultrequest.result是执行指定操作的结果,例如是执行指定操作的结果,例如,执行打开数据库的操作后,通过,执行打开数据库的操作后,通过request.resultrequest.result可以获得打开数据库的实例。可以获得打开数据库的实例。通过数据库实例可以访问数据库。通过数据库
36、实例可以访问数据库。创建创建IndexedDB数据库数据库MyTestDatabase var db;var request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:错误号:+event.target.errorCode);request.onsuccess=function(event)db=request.result;4 创建对象存储空间创建对象存储空间ObjectStore pIndexedDBIndexedDB不是关系型数据库,它使用对象存储空间不是关系型数据库,它使用对象存储空间
37、(ObjectStoreObjectStore)来存储数据。一个数据库中可以包)来存储数据。一个数据库中可以包含多个对象存储空间,对象存储空间使用键值对的含多个对象存储空间,对象存储空间使用键值对的形式来存储数据,即每个数据都由一组键和一组值形式来存储数据,即每个数据都由一组键和一组值组成键类似关系型数据库中表的字段。例如下面的组成键类似关系型数据库中表的字段。例如下面的代码表示一条员工数据:代码表示一条员工数据:id:110,name:李明李明,age:35,email:limingemail IndexedDB数据库提供键的选项数据库提供键的选项 createObjectStore()方法
38、方法 p使用数据库实例对象的使用数据库实例对象的createObjectStore()createObjectStore()方法可以创方法可以创建对象存储空间,方法如下:建对象存储空间,方法如下:pObjectStoreObjectStore对象对象 =数据库实例对象数据库实例对象.createObjectStore(.createObjectStore(对象存储空间名对象存储空间名,提供键的选项提供键的选项)p例如,创建一个对象存储空间例如,创建一个对象存储空间employeesemployees,指定,指定keyPathkeyPath选项为选项为idid(即主键为(即主键为idid),代码
39、如下:),代码如下:var objectStore=db.createObjectStore(employees,keyPath:id)createObjectStore()方法方法 p数据库实例对象数据库实例对象.objectStoreNames.objectStoreNames中包含数据库中所有中包含数据库中所有的对象存储空间名称,在创建对象存储空间之前,可以的对象存储空间名称,在创建对象存储空间之前,可以使用使用objectStoreNames.Contains()objectStoreNames.Contains()方法判断对象存储方法判断对象存储空间名称是否已经存在,例如:空间名称是
40、否已经存在,例如:if(!db.objectStoreNames.contains(employees)var objectStore=db.createObjectStore(employees,keyPath:id);onupgradeneeded事件事件 通常在通常在onupgradeneededonupgradeneeded事件的处理函事件的处理函数中执行改变数据库结构的操作(包括创建数中执行改变数据库结构的操作(包括创建对象存储空间)。对象存储空间)。onupgradeneededonupgradeneeded事件在事件在下列情况下被触发:下列情况下被触发:数据库第一次被打开时;数据
41、库第一次被打开时;打开数据库时指定的版本号高于当前被持打开数据库时指定的版本号高于当前被持久化的数据库版本号。久化的数据库版本号。【例例 15】p在在IndexedDBIndexedDB数据库数据库MyTestDatabaseMyTestDatabase中创中创建对象存储空间建对象存储空间employeesemployees。p定义一个定义一个“创建对象存储空间创建对象存储空间”按钮,按钮,代码如下:代码如下:创建创建对象存储空间对象存储空间create()方法方法 var request;function create()request=indexedDB.open(MyTestDataba
42、se1);request.onerror=function(event)alert(错误号:错误号:+event.target.errorCode);request.onupgradeneeded=function(event)var db=request.result;if(!db.objectStoreNames.contains(employees)var objectStore=db.createObjectStore(employees,keyPath:id);【例例 16】p显示在显示在IndexedDBIndexedDB数据库数据库MyTestDatabaseMyTestData
43、base中中包含的对象存储空间信息。包含的对象存储空间信息。p定义一个定义一个“获取对象存储空间信息获取对象存储空间信息”按钮,按钮,代码如下:代码如下:获取获取对象存储空间信息对象存储空间信息getinfo()方法方法 var request;function getinfo()window.indexedDB=window.indexedDB|window.mozIndexedDB|window.webkitIndexedDB if(window.indexedDB)request=window.indexedDB.open(MyTestDatabase1);request.onerror
44、=function(event)alert(错误号:错误号:+event.target.errorCode);request.onsuccess=function(event)var db=request.result;getinfo()方法方法 document.getElementById(info).innerHTML=数据库数据库MyTestDatabase共有共有+db.objectStoreNames.length.toString()+个对象存个对象存储空间储空间;for(var i=0;i db.objectStoreNames.length;i+)document.getEl
45、ementById(info).innerHTML+=对象存储空间名对象存储空间名:+db.objectStoreNamesi;else alert(您的浏览器不支持您的浏览器不支持IndexedDB数据库。数据库。);div元素元素info p程序从程序从db.objectStoreNamesdb.objectStoreNames数组中获取对数组中获取对象存储空间信息,并将其显示在象存储空间信息,并将其显示在divdiv元素元素infoinfo中。中。pdivdiv元素元素infoinfo的定义代码如下:的定义代码如下:获取对象存储空间信息获取对象存储空间信息 5 创建索引创建索引 p可以通
46、过调用可以通过调用ObjectStoreObjectStore对象对象.createIndex().createIndex()方法在对象存储空间中创建方法在对象存储空间中创建索引,方法如下:索引,方法如下:var 索引对象索引对象=ObjectStore对象对象.createIndex(索引名索引名,创建索引的列(创建索引的列(即即keyPath),索引选项索引选项);例如例如 pObjectStoreObjectStore指向对象存储空间指向对象存储空间employeesemployees,下面的语句可以在对象存储,下面的语句可以在对象存储空间空间employeesemployees的列的列
47、emailemail上创建一个唯上创建一个唯一索引一索引emailemail。objectStore.createIndex(email,email,unique:true)【例例 17】var request;function create()request=indexedDB.open(MyTestDatabase);request.onerror=function(event)alert(错误号:错误号:+event.target.errorCode);request.onupgradeneeded=function(event)var db=request.result;if(!db.
48、objectStoreNames.contains(employees)var objectStore=db.createObjectStore(employees,keyPath:id);objectStore.createIndex(email,email,unique:true);提示提示 p因为数据库因为数据库MyTestDatabaseMyTestDatabase已经存在,已经存在,为了触发为了触发onupgradeneededonupgradeneeded事件,可以在事件,可以在openopen方法中使用数据库版本号参数。方法中使用数据库版本号参数。6 事务事务 p事务是包含一组数
49、据库操作的逻辑工作事务是包含一组数据库操作的逻辑工作单元。在事务中包含的数据库操作是不单元。在事务中包含的数据库操作是不可分割的整体,要么一起被执行,要么可分割的整体,要么一起被执行,要么回滚到执行事务之前的状态。回滚到执行事务之前的状态。1transaction()方法方法 l 调用调用transaction()transaction()方法可以定义一个事务,方法如下方法可以定义一个事务,方法如下l 事务对象事务对象 =数据库实例数据库实例.transaction(.transaction(事务操作的对事务操作的对象存储空间名象存储空间名,事务模式事务模式)l 事务模式包括如下事务模式包括如
50、下3 3种情况:种情况:l IDBTransaction.READ_ONLYIDBTransaction.READ_ONLY,默认值,只读模式,也,默认值,只读模式,也可以使用可以使用readonlyreadonly;l IDBTransaction.READ_WRITEIDBTransaction.READ_WRITE,可读写模式,也可以使,可读写模式,也可以使用用readwritereadwrite;l IDBTransaction.VERSION_CHANGEIDBTransaction.VERSION_CHANGE,版本升级模式。,版本升级模式。事务对象支持下面事务对象支持下面3种事件