/*
* HTML5的Web SQL Databases(html5 本地数据库)API
*
openDatabase方法打开一个已经存在的数据库,如果数据库不存在,它还可以创建数据库。几个参数意义分别是:
1,数据库名称。
2,版本号 目前为1.0,不管他,写死就OK。
3,对数据库的描述。
4,设置数据的大小。
5,回调函数(可省略)。
**
transaction:这个方法允许我们根据情况控制事务提交或回滚
executeSql函数有四个参数,其意义分别是:
1)表示查询的字符串,使用的SQL语言是SQLite 3.6.19。
2)插入到查询中问号所在处的字符串数据。
3)成功时执行的回调函数。返回两个参数:tx和执行的结果。
4)一个失败时执行的回调函数。返回两个参数:tx和失败的错误信息。
**
*/
var lanxDB = function(dbname) {
var db = openDatabase(dbname, '1.0.0', '', 65536);
return {
// 返回数据库名
getDBName: function() {
return dbname;
},
// 初始化数据库,如果需要则创建表
init: function(tableName, colums) {
this.switchTable(tableName);
colums.length > 0 ? this.createTable(colums) : '';
return this;
},
// 创建表,colums:[name:字段名,type:字段类型]
createTable:function(colums) {
var sql = "CREATE TABLE IF NOT EXISTS " + this._table, t;
if (colums instanceof Array && colums.length > 0) {
t = [];
for (var i in colums) {
t.push(colums[i].name + ' ' + colums[i].type);
}
t = t.join(', ');
} else if (typeof colums == "object"){
t += colums.name+' '+colums.type;
}
sql = sql + " ("+t+")";
var that = this;
db.transaction(function(t) {
// 执行真实的SQL查询
t.executeSql(sql);
})
},
// 切换表
switchTable: function(tableName) {
this._table = tableName;
return this;
},
// 插入数据并执行回调函数,支持批量插入
// data为Array类型,每一组值均为Object类型,每一个Obejct的属性应为表的字段名,对应要保存的值
insertData: function(data, callback) {
var that = this;
var sql = "INSERT INTO " + this._table;
if (data instanceof Array && data.length > 0) {
var cols = [], qs = [];
for (var i in data[0]) {
cols.push(i);
qs.push('?');
}
sql += " ("+cols.join(',')+") Values ("+qs.join(',')+")";
} else {
return false;
}
var p = [], d = data, pLenth = 0, r = [];
for (var i = 0, dLength = d.length; i < dLength; i++) {
var k = [];
for (var j in d[i]) {
k.push(d[i][j]);
}
p.push(k);
}
var tx;
var queue = function(b, result) {
if (result){
r.push(result.insertId || result.rowsAffected);
}
if (p.length > 0) {
tx.executeSql(sql, p.shift(), queue, that.onfail);
} else {
callback && callback.call(this,r);
}
}
// 根据情况控制事务提交或回滚
db.transaction(function(t) {
tx = t;
queue();
})
},
_where: '',
// where语句,支持自写和以对象属性值对的形式
where: function(where) {
if (typeof where === 'object') {
var j = this.toArray(where);
this._where = j.join(' and ');
} else if (typeof where === 'string') {
this._where = where;
}
return this;
},
// 更新数据,data为属性值对形式
updateData: function(data, callback) {
var that = this;
var sql = "Update " + this._table;
data = this.toArray(data).join(',');
sql += " Set " + data + " where " + this._where;
this.doQuery(sql, callback);
},
// 根据条件保存数据,如果存在则更新,不存在则插入数据
saveData: function(data, callback) {
var sql = "Select * from "+this._table+" where " + this._where;
var that = this;
this.doQuery(sql, function(r) {
if (r.length > 0) {
that.updateData(data, callback);
} else {
that.insertData([data], callback);
}
});
},
//获取数据
getData: function(callback) {
var that = this;
var sql = "Select * from " + that._table;
that._where.length > 0 ? sql += " where " + that._where : "";
that.doQuery(sql, callback);
},
// 查询,内部方法
doQuery: function(sql, callback) {
var that = this;
var a = [];
var bb = function(b, result) {
if (result.rows.length){
for (var i = 0; i < result.rows.length; i++) {
a.push(result.rows.item(i));
}
} else {
a.push(result.rowsAffected);
}
callback && callback.call(that,a);
}
db.transaction(function (t) {
t.executeSql(sql, [], bb, that.onfail) ;
})
},
// 根据条件删除数据
deleteData: function(callback) {
var that = this;
var sql = "delete from " + that._table;
that._where.length > 0 ? sql += " where "+that._where : '';
that.doQuery(sql, callback);
},
// 删除表
dropTable: function() {
var sql = "DROP TABLE IF EXISTS " + this._table;
this.doQuery(sql);
},
_error:'',
onfail: function(t, e) {
this._error = e.message;
console.log('----sqlite:' + e.message);
},
toArray: function(obj) {
var t = [];
obj = obj || {};
if (obj) {
for (var i in obj) {
t.push(i + "='" + obj[i] + "'");
}
}
return t;
}
}
}
/*
var db = new lanxDB('testDB');
db.init('channel_list',[
{name:'id',type:'integer primary key autoincrement'},
{name:'name',type:'text'},
{name:'link',type:'text'},
{name:'cover',type:'text'},
{name:'updatetime',type:'integer'},
{name:'orders',type:'integer'}
]);
db.init('feed_list',[
{name:'parentid',type:'integer'},
{name:'feed',type:'text'}
]);
db.switchTable('channel_list').insertData([
{name:'aa', link:'ss', updatetime: new Date().getTime()},
{name:'cc', link:'kk', updatetime: new Date().getTime()}
]);
db.where({name:'aa'}).getData(function(result){
console.log(result);//result为Array
});
db.where({name:'cc'}).deleteData(function(result){
console.log("删除条数:"+result[0]);//删除条数
});
db.where({name:'aa'}).saveData({link:'asdfasdfasdf'},function(result){
console.log(result);//影响条数
});
*/