HTML5中增加了两种全新的数据存储方式:Web Storage和Web SQL Database.
Web Storage:可用于临时或永久保存客户端的少量数据,
Web SQL Database:客户端本地化的一套数据库系统,将大量的数据保存在客户端,而无需与服务器交互,极大减轻了服务器的压力,加快了其他页面浏览的速度。
一、WebStorage存储
相应的API类型分为两种:
sessionStorage(保存会话数据)
localStorage(在客户端长期保存数据)
1. sessionStorage 对象:保存数据时间非常短暂,因为该数据实质上是保存在session对象中。用户在打开浏览器时,可以查看 *** 作过程中要求临时保存的对象,一旦关闭浏览器,所有使用sessionStorage对象保存的数据将全部丢失。
保存数据:sessionStorage.getItem(key,value)
对应格式为(键名,键值)。一旦键名设置成功,则不允许修改,也不能重复,若重复,会覆盖原有的键名值。
读取数据:sessionStorage.getItem(key) 返回一个指定键名对应的键值,如果不存在,则返回Null值。
sessionStorage对象保存于读取临时数据
ps:但重新打开网页时,原先sessionStorage对象保存的内容会全部丢失,所以当用户直接单击“读取”时,无法读取指定键名的键值。
2. localStorage对象:可以将数据长期保存在客户端,直至人工消除为止。
保存对象:localStorage.setItem(key,value)
读取对象:localStorage.getItem(key)
如果要清除对象保存的内容:localStorage.removeItem(key)
一旦成功,与键名对应的相应数据将全部被删除。
ps:尽管使用localStorage对象可以将数据长期保存在客户端,当在跨浏览器读取数据时,被保存的数据不可公用,即每一个浏览器只能读取各自浏览器中保存的数据,不能访问其他浏览器中保存的数据。
二、localStorage详解
1. 清除localStorage数据:如果要删除某个键名对应的记录,只需要调用removeItem()函数即可,但有时保存的数据很多,可以用:localStorage.clear()
表示清空全部的数据,一旦使用localStorage对象保存了数据,用户就可以在浏览器中打开相应的代码调试工具,查看每条数据对应的键名与键值,执行删除与清空 *** 作后,其对应的数据也会发生变化,这些变化可以通过浏览器的代码调试工具进行侦查。
ps:各浏览器查看localStorage对象说保存的数据方式不完全相同,chrome10中,单击右键,选择“审查元素”,单击“resources”进行查看;firefox使用firebug调试工具作为存储查看器;Opera在页面中单击右键,选择“检查元素”,单击“本地资源”选项卡进行查看。
2.遍历localStorage数据
为了遍历localStorage这些数据,在遍历过程中,需要访问localStorage对象的另外两个属性:length与key,前者是对象中保存数据的总量;后者是保存数据时的键名项。其中,索引值以0开始。
正在读取数据...
3. 使用json对象存储数据
上面那种方式存储数据只能应对少量数据,为了解决这一问题,在html5中可以通过localStorage与JSON对象的转换,快速实现存储更多数据的功能。
如果将localStorage数据转成json对象,需调用json对象的parse()方法:
JSON.parse(data)
参数data表示localStorage对象获取的数据,该方法将返回一个装载data数据的json对象。还可通过stringify(),将一个实体对象转换成json格式的文本数据:
JSON.stringify(obj)
obj表示一个任意的实体对象,调用该方法将返回一个由实体对象转成JSON格式的文本数据集
HTML5本地存储——Web SQL Database在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就无能为力了,灵活大不够强大。
Web SQL Database
我们经常在数据库中处理大量结构化数据,html5引入Web SQL Database概念,它使用 SQL 来 *** 纵客户端数据库的 API,这些 API 是异步的,规范中使用的方言是SQLlite,悲剧正是产生于此,Web SQL Database规范页面有着这样的声明
This document was on the W3C Recommendation track but specification work has stopped. The specification reached an impasse: all interested implementors have used the same SQL backend (Sqlite), but we need multiple independent implementations to proceed along a standardisation path.
大概意思就是
这个文档曾经在W3C推荐规范上,但规范工作已经停止了。目前已经陷入了一个僵局:目前的所有实现都是基于同一个SQL后端(SQLite),但是我们需要更多的独立实现来完成标准化。
也就是说这是一个废弃的标准了,虽然部分浏览器已经实现,但。。。。。。。
三个核心方法
但是我们学一下也没什么坏处,而且能和现在W3C力推的IndexedDB做比较,看看为什么要废弃这种方案。Web SQL Database 规范中定义的三个核心方法:
openDatabase:这个方法使用现有数据库或新建数据库来创建数据库对象
transaction:这个方法允许我们根据情况控制事务提交或回滚
executeSql:这个方法用于执行SQL 查询
openDatabase
我们可以使用这样简单的一条语句,创建或打开一个本地的数据库对象
var db = openDatabase('testDB', '1.0', 'Test DB', 2 * 1024 * 1024)
openDatabase接收五个参数:
数据库名字
数据库版本号
显示名字
数据库保存数据的大小(以字节为单位 )
回调函数(非必须)
如果提供了回调函数,回调函数用以调用 changeVersion() 函数,不管给定什么样的版本号,回调函数将把数据库的版本号设置为空。如果没有提供回调函数,则以给定的版本号创建数据库。
transaction
transaction方法用以处理事务,当一条语句执行失败的时候,整个事务回滚。方法有三个参数
包含事务内容的一个方法
执行成功回调函数(可选)
执行失败回调函数(可选)
db.transaction(function (context) {
context.executeSql('CREATE TABLE IF NOT EXISTS testTable (id unique, name)')
context.executeSql('INSERT INTO testTable (id, name) VALUES (0, "Byron")')
context.executeSql('INSERT INTO testTable (id, name) VALUES (1, "Casper")')
context.executeSql('INSERT INTO testTable (id, name) VALUES (2, "Frank")')
})
这个例子中我们创建了一个table,并在表中插入三条数据,四条执行语句任何一条出现错误,整个事务都会回滚
executeSql
executeSql方法用以执行SQL语句,返回结果,方法有四个参数
查询字符串
用以替换查询字符串中问号的参数
执行成功回调函数(可选)
执行失败回调函数(可选)
在上面的例子中我们使用了插入语句,看个查询的例子
db.transaction(function (context) {
context.executeSql('SELECT * FROM testTable', [], function (context, results) {
var len = results.rows.length, i
console.log('Got '+len+' rows.')
for (i = 0i <leni++){
console.log('id: '+results.rows.item(i).id)
console.log('name: '+results.rows.item(i).name)
}
})
完整示例
<!DOCTYPE HTML>
<html>
<head>
<title>Web SQL Database</title>
</head>
<body>
<script type="text/javascript">
var db = openDatabase('testDB', '1.0', 'Test DB', 2 * 1024 * 1024)
var msg
db.transaction(function (context) {
context.executeSql('CREATE TABLE IF NOT EXISTS testTable (id unique, name)')
context.executeSql('INSERT INTO testTable (id, name) VALUES (0, "Byron")')
context.executeSql('INSERT INTO testTable (id, name) VALUES (1, "Casper")')
context.executeSql('INSERT INTO testTable (id, name) VALUES (2, "Frank")')
})
db.transaction(function (context) {
context.executeSql('SELECT * FROM testTable', [], function (context, results) {
var len = results.rows.length, i
console.log('Got '+len+' rows.')
for (i = 0i <leni++){
console.log('id: '+results.rows.item(i).id)
console.log('name: '+results.rows.item(i).name)
}
})
})
</script>
</body>
</html>
最后
由于Web SQL Database规范已经被废弃,原因说的很清楚,当前的SQL规范采用SQLite的SQL方言,而作为一个标准,这是不可接受的,每个浏览器都有自己的实现这还搞毛的标准。这样浏览器兼容性就不重要了,估计慢慢会被遗忘。不过Chrome的控制台真心好用啊,神马cookie、Local Storage、Session Storage、Web SQL、IndexedDB、Application Cache等html5新增内容看的一清二楚,免去了很多调试代码工作。
HTML5的Web SQL Databases(html5 本地数据库)的确很诱惑人,当你发现可以用与mysql查询一样的查询语句来 *** 作本地数据库时,你会发现这东西挺有趣的。今天,我们一起来了解HTML 5的Web SQL Database API:openDatabase、transaction、executeSql。Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范。它通过一套API来 *** 纵客户端的数据库。Safari、Chrome、Firefox、Opera等主流浏览器都已经支持Web SQL Database。HTML5的Web SQL Databases的确很诱惑人,当你发现可以用与mysql查询一样的查询语句来 *** 作本地数据库时,你会发现这东西挺有趣的。今天,我们一起来了解HTML 5的Web SQL Database API。
下面将一一将介绍怎样创建打开数据库,创建表,添加数据,更新数据,删除数据,删除表 。
先介绍三个核心方法
1、openDatabase:这个方法使用现有数据库或创建新数据库创建数据库对象。
2、transaction:这个方法允许我们根据情况控制事务提交或回滚。
3、executeSql:这个方法用于执行真实的SQL查询。
第一步:打开连接并创建数据库
代码如下:
var dataBase = openDatabase("student", "1.0", "学生表", 1024 * 1024, function () { })
if (!dataBase) {
alert("数据库创建失败!")
} else {
alert("数据库创建成功!")
}
解释一下openDatabase方法打开一个已经存在的数据库,如果数据库不存在,它还可以创建数据库。几个参数意义分别是:
1,数据库名称。
2,版本号 目前为1.0,不管他,写死就OK。
3,对数据库的描述。
4,设置数据的大小。
5,回调函数(可省略)。
初次调用时创建数据库,以后就是建立连接了。
创建的数据库就存在本地,路径如下:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\databases\http_localhost_4987 。
创建的是一个sqllite数据库,可以用SQLiteSpy打开文件,可以看到里面的数据。SQLiteSpy是一个绿色软件,可以百度一下下载地址或SQLiteSpy官方下载:SQLiteSpy。
第二步:创建数据表
代码如下:
this.createTable=function() {
dataBase.transaction( function(tx) {
tx.executeSql(
"create table if not exists stu (id REAL UNIQUE, name TEXT)",
[],
function(tx,result){ alert('创建stu表成功')},
function(tx, error){ alert('创建stu表失败:' + error.message)
})
})
}
解释一下,
executeSql函数有四个参数,其意义分别是:
1)表示查询的字符串,使用的SQL语言是SQLite 3.6.19。
2)插入到查询中问号所在处的字符串数据。
3)成功时执行的回调函数。返回两个参数:tx和执行的结果。
4)一个失败时执行的回调函数。返回两个参数:tx和失败的错误信息。
第三步:执行增删改查
1)添加数据:
代码如下:
this.insert = function () {
dataBase.transaction(function (tx) {
tx.executeSql(
"insert into stu (id, name) values(?, ?)",
[id, '徐明祥'],
function () { alert('添加数据成功')},
function (tx, error) { alert('添加数据失败: ' + error.message)
} )
})
2)查询数据
代码如下:
this.query = function () {
dataBase.transaction(function (tx) {
tx.executeSql(
"select * from stu", [],
function (tx, result) { //执行成功的回调函数
//在这里对result 做你想要做的事情吧...........
},
function (tx, error) {
alert('查询失败: ' + error.message)
} )
})
}
解释一下
上面代码中执行成功的回调函数有一参数result。
result:查询出来的数据集。其数据类型为 SQLResultSet ,就如同C#中的DataTable。
SQLResultSet 的定义为:
代码如下:
interface SQLResultSet {
readonly attribute long insertId
readonly attribute long rowsAffected
readonly attribute SQLResultSetRowList rows
}
其中最重要的属性—SQLResultSetRowList 类型的 rows 是数据集的“行” 。
rows 有两个属性:length、item 。
故,获取查询结果的某一行某一列的值 :result.rows[i].item[fieldname] 。
3)更新数据
代码如下:
this.update = function (id, name) {
dataBase.transaction(function (tx) {
tx.executeSql(
"update stu set name = ? where id= ?",
[name, id],
function (tx, result) {
},
function (tx, error) {
alert('更新失败: ' + error.message)
})
})
}
4)删除数据
代码如下:
this.del = function (id) {
dataBase.transaction(function (tx) {
tx.executeSql(
"delete from stu where id= ?",
[id],
function (tx, result) {
},
function (tx, error) {
alert('删除失败: ' + error.message)
})
})
}
5)删除数据表
代码如下:
this.dropTable = function () {
dataBase.transaction(function (tx) {
tx.executeSql('drop table stu')
})
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)