Web Sql Database 操作类,将查询语句作为参数传入。

因为个人想开发 iphone native web app,所以想用HTML 5新特性,研究了两天,终于写了一个Web Sql Database 操作类。

Author: Lein

Emaill: lein_urg@163.com

网上很多文章都不是通过传入参数的办法,而是写死代码的方法,这样就很难灵活运用;

注意:我试了ie 9,firefox 11,貌似他们都不支持openDatabase,如果有知道的,请邮件通知我,我用的是windows下的safari版本 5.1.5,chrome 18也通过了

另外提醒下想自己写的朋友,数据库操作是异步的,你很有可能无法立即查询到你插入的数据,我就是因为这个原因搞了好久。

// JavaScript Document
function _db_query(tx)
{
	var _sqls = typeof(this.sqls)=='undefined'?_db_query.sqls:this.sqls;
 	while(_sqls.length)
 	{
  		var sql = _sqls.shift();		
		tx.executeSql(
			sql[0],
			sql[1],
			function (t, results)
						{     
							try
							{
								if(results.rows.length>0)
								{
										var data = [];
										for(var i=0;i<results.rows.length;i++)
										{
											data.push(results.rows.item(i));
										}
										this.db_cb(true, data, 0,  0);
								}
								else if(results.rowsAffected)
								{
									try{
										this.db_cb(true, null, results.insertId,  results.rowsAffected);
									}
									catch(e)
									{
										this.db_cb(true, null, 0,  results.rowsAffected);
									}
								}
							}
							catch(e)
							{
								alert(e.message);
							}
						}, 
			function (t, e)
						{
							var tmp = '';
							if(typeof(e)=='object')
							{
								for(var x in e)
								{
									tmp += x+'='+e[x]+'\n';
								}
								var error = tmp;
							}else var error = e.message;
							
							this.db_cb(false, error,0,0);
						}
		);
	}
}

function webdb(_cb,_name,_size){
		this.name = _name;
		this.size = _size;
		this.version = arguments.length>3?arguments[3]:1.0;
		this.desc = arguments.length>4?arguments[4]:'';
		this.db = openDatabase(this.name, this.version, this.desc, this.size * 1024);
		this.webdb_query = _db_query;
		this.webdb_query.__proto__.db_cb = _cb;
		this.webdb_query.__proto__.sqls = [];
		if(!this.db) return false;
}

webdb.prototype = {
	db_cb:function(){},
	query:function(sql)
	{
		if(arguments.length>1)
		{
			var arg=arguments[1];
		}else var arg=[];

		this.webdb_query.sqls.push([sql,arg]);
		this.db.transaction(
				this.webdb_query
			);
	}
}


使用方法:

<!DOCTYPE html> 
<html>
<head>
<meta charset="utf-8">
<title>db test</title>
</head>
<script language="javascript" src="include/db.js"></script>
<body>
</head>
<script language="javascript">
function rand(min,max)
{
    return Math.round(Math.random()*(max-min)+(min));
}
function db_cb(flag,rows,ist_id,ef_row)
{
	if(!flag)
	{
		alert("Error: \n"+rows);
		return;
	}
	if(ist_id>0)
	{
		alert("ist_id="+ist_id);
	}else if(ef_row>0){
		alert("ef_row="+ef_row);
	}else{
		var len = rows.length;
		if(len>0)
		{
			var tmp = "";
			for(var a=0;a<len;a++)
			{
				var tmp1 = rows[a];
				for(var b in tmp1)
				{
					tmp+="b["+a+"]["+b+"]="+tmp1[b]+"\n";
				}
			}
			alert("tmp="+tmp);
		}
	}
}

var tbname = "t"+rand(11111,999999);
document.write("<h1>"+tbname+"</h1>");
var db=new webdb(db_cb,'test',1024);
db.db_cb = db_cb;
db.query('create TABLE '+tbname+'(id uniquee,name,age) ');
db.query('insert into '+tbname+'(id,name,age) values(1,\'lein\',\'32\')');
db.query('insert into '+tbname+'(id,name,age) values(2,\'lili\',\'25\')');
db.query('insert into '+tbname+'(id,name,age) values(3,\'xx\',\'2\')');
db.query('update '+tbname+' set name=? where id=?',['xiangxiang',3]);
db.query('select * from '+tbname+'');

</script>
</body>
</html>


我的QQ群:

PHPer&Webgame&移动开发,群号:95303036

原文地址:https://www.cnblogs.com/lein317/p/5067631.html