• 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);//影响条数
    });
    
    */
  • 相关阅读:
    008. 限制上传文件的大小
    007. 实现登录验证的方式
    006. 创建包含公共类的文件夹
    005. asp.net页面常用指令
    004. 连接默认错误页
    003. 连接access数据库代码
    VS2013生成Release版本MFC程序在其他机器上运行
    MFC WebBrowser判断网页加载完成
    第一课 JAVA环境与第一个HelloWorld运行
    HTTP协议详解&TCP&OSI七层概念模型
  • 原文地址:https://www.cnblogs.com/zhoulingfeng/p/3492794.html
Copyright © 2020-2023  润新知