《Javascript权威指南》学习笔记之十八:BOM新成就(1)--客户端存储数据(Web SQL DataBase实现)

使用本地存储和会话存储可以实现简单的对象持久化,可以对简单的键值对或对象进行存储。但是,对于比较复杂的关系数据进行处理时,就要用Web SQL Database.浏览器对Web SQL Database的支持情况如图:

一、如何使用Web SQL Database

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="content-type" content="text/html;charset=utf-8">
	<title>Web SQL</title>
</head>
<body>
	<script type="text/javascript">
		//1、创建数据库连接
		try
		{
			var db = window.openDatabase('mydb','1.0','The First Web SQL Database','2*1024');
		}
		catch(err)
		{
			alert(err.message?err.message:err.toString());
		}
		//验证连接
		if(!db)
		{
			alert("不能连接数据库");
		}

		//2、执行SQL操作
		db.transaction(callback);
		//3、定义事务操作的回调函数
		function callback(tx)
		{
			//在事务中执行SQL操作
			var sql;
			//创建数据库表的结构
			sql = "create table emp(firstName text,lastName text,empType text,age integer)";
			tx.executeSql(sql);

			//插入数据库记录
			sql = "insert into emp(firstName,lastName,empType,age) values('kang','yua','my',20)";
			tx.executeSql(sql);

			sql = "insert into emp(firstName,lastName,empType,age) values(?,?,?,?)";
			tx.executeSql(sql,['kang','yuan','myEmp',30]);

			//查询数据记录
			sql = "select * from emp";
			tx.executeSql(sql,[],queryResult,queryError);
		}

		//SQL操作的回调函数
		function queryError(tx,err)
		{
			alert(err.message?err.message:err.toString());
		}

		function queryResult(tx,result)
		{
			try
			{
				//获取所有行
				var rowList = result.rows;
				//获取每行的记录
				for(var i = 0; i < rowList.length; i++)
				{
					var row = rowList.item(i);
					for(var j in row)
					{
						document.write(j+"="+row[j]+"<br/>");
					}
				}
			}
			catch(err)
			{
				alert(err.message?err.message:err.toString());
			}
		}
	</script>
</body>
</html>

在google中的结果和Web SQL中的数据:

二、异步数据库

使用window.openDatabase()方法创建本地数据库连接或者建立与已经存在的数据库之间的连接,称为异步执行数据库。因为它的操作并非同步操作,而是需要很多回调函数来接收异步执行的结果。

1、var db = window.openDatabase(name,version,displayName,estimatedSize[,creationCallback]):返回一个Database对象。

name:定义的数据库名,区分大小写且唯一。

version:创建的数据库的版本,具有唯一性。

displayName:数据库的描述信息,一般用于说明数据库的用途。

estimatedSize:数据库的预计大小,以byte为大小,可以更改。

creationCallback:可选,数据库没有被创建时执行的回调函数。

2、执行数据库事务:数据库创建成功返回Database对象,可以执行数据库操作。数据库的操作都是事务的。

2.1   db.transaction(callback[,errorCallback[,sucessCallback]]):执行事务的读写操作。

callBack:定义事务操作要执行的回调函数,该函数内执行的SQL操作都是事务的,要么全部成功或要么全部失败。该函数有一个SQLTransaction对象参数,该对象定义的方法执行SQL操作。

errorCallback:定义事务操作失败时调用的函数,该函数有一个SQLError对象的参数。

sucessCallback:定义事务操作成功时调用的函数,无参数。

2.2  db.readTransaction(callback[,errorCallback[,sucessCallback]]):执行事务的读操作,不可以进行写操作。参数同2.1.

3、数据库版本管理

db.changeVersion(oldVersion,newVersion[,callback[,errorCallback[,sucessCallback]]]):用于改变数据库的版本。后续三个可选的参数同2.1。oldVersion是当前版本号,一般设置为Database.version(该属性返回DB的版本号);newVersion:新版本号,为字符串类型。

4、执行SQL语句:SQLTransaction对象定义了executeSql()方法执行SQL操作。

tx.executeSql(sql[,arg[,callback[,errorCallback]]]):

sql:执行的SQL语句

arg:可选,定义替换参数化查询中"?"占位符的数组,若没有使用参数化查询,参数可以忽略或者为空。

callback:定义一个SQL操作成功时执行的回调函数,若不定义,可以设置为null。该回调函数有两个参数:第一个是SQLTransaction对象,第二个是SQLResult对象,表示执行的结果。

errorCallback:定义一个SQL操作失败时执行的回调函数,若不定义,可以设置为null。该回调函数有两个参数:第一个是SQLTransaction对象,第二个是SQLError对象。

三、同步数据库

同步数据库操作仅用在worker内,不能用在网页中,但是在worker内可以使用异步数据库。目前仅有Chrome 6支持同步数据库。

1、创建连接:在worker()内用WorkerGlobalScope.openDatabaseSync()方法创建本地数据库或者建立已经存在的数据库之间的连接。称为同步数据库,不需要各种回调函数来处理数据库操作结果。

var db = self.openDatabaseSync(name,version,displayName,estimatedSize[,creationCallback]):返回一个DatabaseSync对象,参数同openDatabase()方法。

2、执行数据库事务:db.transaction(callback)[执行读写操作]和db.readTransaction(callback)[执行写操作],callback函数的参数是一个SQLTransactionSync对象,该对象定义的方法执行SQL操作。

//事务操作的JS代码放在一个worker.js文件中
//在HTML中创建Worker并接收消息
if(window.Worker)
{
var worker = new Worker("worker.js");
....
}
else
{
alert("不支持Worker");
}

3、数据库版本管理:

db.changeVersion(oldVersion,newVersion[,callback]):用于改变数据库的版本。可选的参数同上。oldVersion是当前版本号,一般设置为DatabaseSync.version(该属性返回DB的版本号);newVersion:新版本号,为字符串类型。

4、执行SQL语句:SQLTransactionSync对象定义了executeSql()方法执行SQL操作。

var re=tx.executeSql(sql[,arg]):返回结果集

sql:执行的SQL语句

arg:可选,定义替换参数化查询中"?"占位符的数组。若没有使用参数化查询,参数可以忽略或者为空。

四、处理数据库操作的结果

成功使用executeSql()方法执行的SQL返回一个执行结果,该结果作为executeSql()的参数返回,是一个SQLResult对象。

interface SQLResult
{
readonly attribute long insertId; //返回记录行的ID
readonly attribute long rowsAffected; //返回SQL语句改变的行数
readonly sttribute SQLResultRowList rows;//返回所有记录行,没有记录则返回空对象
}

SQLResultRowList对象由SQLResultSetRowList接口定义

interface SQLResultSetRowList
{
readoonly attribute unsigned long length; //放回记录的行数
getter any item(in unsigned long index);//根据索引获取指定行,索引不存在返回null
}

五、SQL注入

使用参数化查询可以防止恶意SQL注入。参数化查询指定SQL语句中使用问号(?)作为参数占位符,为数据库访问应用程序开发提供了一种安全、封装性的方法,将输入交给数据库进行预处理。

《Javascript权威指南》学习笔记之十八:BOM新成就(1)--客户端存储数据(Web SQL DataBase实现)

时间: 2024-10-06 01:15:19

《Javascript权威指南》学习笔记之十八:BOM新成就(1)--客户端存储数据(Web SQL DataBase实现)的相关文章

JavaScript权威指南学习笔记之一

1.关于分号 javascript里面不强制使用分号来表示一行语句的结束,但是最好能够在写js之前,特别是在原有的js上面新增时,最好前置一个分号.避免这种情况发生:  2.JavaScript类型转换 3.关于=== ①如果类型不同则不等 ②null===null或undefined===undefined ③true===true或false===false ④NaN不等 ⑤0===0 0===-0 ⑥如果是同一个object,array,function则相等 4.关于== ①如果已经==

javascript权威指南学习笔记1

打开这本书,进入到javascript的世界.以前都是看各种视频,感觉什么收获也没有,反而弄得脑袋混乱,希望能够按照这本书的节奏掌握javascript这门语言,为我的前端学习打下基础. 学习前准备:web浏览器(F12用来唤醒和关闭firebug界面,ctrl+shift+j用来唤醒错误工作台,console.log()调试辅助) 本书分为4个部分:Javascript语言核心:客户端Javascript:Javascript核心参考:客户端Javascript参考.今天主要学了第一部分.主要

javascript权威指南学习笔记2

Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相等,包括自身.if(x!=x) return NAN:==>isNaN()判断是不是NaN或者字符串等 javascript的精度要注意,即(0.3-0.2)!=(0.2-0.1) Date()构造函数:月份从0开始计数,天数从1开始计数,星期天是0: 2.文本: 转义字符(牢记斜杠后面几个特殊的值

javascript 权威指南学习笔记

//通过id查找多个元素 function getElements(/*ids...*/){ var elements = {}: for(var i=0; i<arguments.length; i++){ var id = arguments[i]; var elt =document.getElementById("id"); if(elt == null) throw new Error("No element with id :" +id); ele

《Javascript权威指南》学习笔记之十七:BOM新成就(1)--客户端存储数据(Storage实现)

1.进入短信界面 2.菜单-设置 3.修改短信中心号码(Set the SIM's smsc number) 保存 [测试结果]:提示保存成功,但是号码没有改变,退出重新进入设置才会看到号码更新 [预期结果]:提示保存成功,号码变为修改过的号码 相关Activity:通过Logcat中I/ActivityManager( 896):我们可以定位到该类-MessagingPreferenceActivity: 相关控件:mSmscPrefList.add(pref); 根据分析我们发现在Messa

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

Git权威指南学习笔记(一)Git初始化

1.在Git中配置用户名和邮件地址 $ git config --global user.name "Jymn_Chen" $ git config --global user.email "[email protected]" 注意把用户名和邮件地址替换成你自己的资料. 在这里的参数global表示配置的作用范围是当前用户,如果将参数改为system,那么配置的作用范围是系统中的所有用户. 2.创建版本库 新建一个目录并cd到目录中,执行以下命令: $ git i

Git权威指南学习笔记(二)Git暂存区

如下图所示: 左侧为工作区,是我们的工作目录. 右侧为版本库,其中: index标记的是暂存区(stage),所处目录为.git/index,记录了文件的状态和变更信息. master标记的是master分支所代表的目录树.HEAD指向master分支. objects标记的是Git的对象库,所处目录为.git/objects,文件索引建立了文件和对象库中对象实体之间的映射关系. 通过该图我们可以清晰地看出add,commit等命令的转化关系.下面通过git diff和git status两条命