原先想調用websql儲存一定量的數據,於是寫了這麼一段代碼,類jQuery鏈式操作,操作非常順暢,卻沒想到頁面一刷新,卵都毛了。哎,不是規範的,還是儘量少研究啊。不說了,說多了都是淚。現記錄下這段代碼,以備參考。
想要持久儲存,估計要麼就localStory或indexDb了,回頭再研究了。
if(!die)var die=function(str){alert(str);return false;}
var xdb={
dbh:'',table:'',fields:'*',condition:'1',orders:'',limits:'',cb:function(tx,rt){ console.log(tx,rt);},err:function(error){ console.log(error);},
open:function(dbname,ver,desc/*描述*/,size){
if(!ver)ver='1.0';
if(!desc)desc='';
if(!size)size=5;//mb
this.dbh=openDatabase(dbname,ver,desc, size * 1024 * 1024);
this.table='';this.fields='*';this.condition='1';this.orders='';this.limits='';
},
//設置表
from:function(tableName){ this.table=tableName;this.fields='*';this.condition='1';this.orders='';this.limits='';return this;},
field:function(fields){ this.fields=fields;return this;},
where:function(condition){ this.condition=condition;return this; },
order:function(str){ this.orders=' order by '+str;return this;},
limit:function(start,end){ this.limits=' limit '+start+' '+end;return this;},
select:function(cb){
if(typeof(cb)!='function')cb=this.cb;
var sql='select '+this.fields+' from '+this.table+' where '+this.condition+this.orders+this.limits;
this.dbh.transaction(function (tx) {
tx.executeSql(sql,[],function(tx,rt){ cb(rt.rows);},this.err);
});
},
exec:function(sql,data,cb){
if(!sql)return die('未輸入sql語句');
data=typeof(data)=='object'?data:[];
cb=typeof(cb)=='function'?cb:this.cb;
this.dbh.transaction(function (tx) {
tx.executeSql(sql,data,cb,this.err);
});
},
save:function(strs,data,cb){
if(!this.table)return die('未指定數據表');
if(!strs)return die('未指定更新的數據');
var sql='update '+this.table+' set '+strs+' where '+this.condition+this.order+this.limit;
data=typeof(data)=='object'?data:[];
cb=typeof(cb)=='function'?cb:null;
this.dbh.transaction(function (tx){
tx.executeSql(sql,data,cb,this.err);
});
},
add:function(d,cb){
if(!this.table)return die('未指定數據表');
if(typeof(d)!='object')return die('未指定添加的數據');
var keys=[],vals=[],v1=[];
for(itm in d){
keys.push(itm);vals.push(d[itm]);v1.push('?')
}
var sql='replace into '+this.table+'('+keys.join(',')+') values ('+v1.join(',')+')';
cb=typeof(cb)=='function'?cb:null;
this.dbh.transaction(function (tx) {
tx.executeSql(sql,vals,cb,this.err);
});
},
'delete':function(cb){
if(!this.table)return die('未指定數據表');
var sql='delete from '+this.table+' where '+this.condition+this.order+this.limit;
cb=typeof(cb)=='function'?cb:null;
this.dbh.transaction(function (tx) {
tx.executeSql(sql,[],cb,this.err);
});
}
};
//使用方法
xdb.open('mydb');
xdb.exec("create table if not exists test (id unique,text)");//創建表
xdb.from('test');//關聯數據表
xdb.add({id:1,text:'測試1test'});//新增
xdb.add({id:2,text:'測試2test'});//新增
xdb.where('id=1').delete();//刪除
xdb.where('id=2').save('text="修改 2edit"');//修改
//查詢
var r=xdb.from('test').field('*').where('id=2');
r.select(function(d){console.log(d);});
以上代碼可直接貼到chrome瀏覽器運行。