HTML5的Web SQL Databases(html5 本地数据库)API

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

*/

 

posted @ 2013-12-26 17:21  风之约  阅读(733)  评论(0编辑  收藏  举报