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

*/

 

分类:

技术点:

相关文章: