因为个人想开发 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