/* * 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);//影响条数 }); */