操作sqlite的JavaScript类

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

/*************************************/
/* Helman, heldes.com      */
/* helman at heldes dot com    */
/* sqlitedb.js           */
/* SQLite Database Class For HTML5 */
/*************************************/

function cDB(confs) {
    var ret = {
        _db : null,
        _response : null,
        _error : null,
        check : function (tbl) {
            if (!this._db)
                return false;
            var _sql = '',
            _sqlField = '',
            _field = [];
            
            for (var i = 0; i < tbl.length; i++) {
                _sql = "CREATE TABLE IF NOT EXISTS " + tbl[i].table + " (";
                _field = tbl[i].properties;
                _sqlField = '';
                
                for (var j = 0; j < _field.length; j++) {
                    _sqlField += ',`' + _field[j].name + '` ' + _field[j].type;
                }
                
                _sql += _sqlField.substr(1) + ");";
                
                this.query(_sql, null, null, null);
            }
            
            return true;
        },
        getResult : function () {
            return this._response;
        },
        getError : function () {
            return this._error;
        },
        callback_error : function (tx, _er) {
            var err = '';
            if (typeof(tx) == 'object') {
                for (var q in tx) {
                    err += q + ' = "' + tx[q] + '"; ';
                }
            } else {
                err += tx + '; ';
            }
            if (typeof(_er) == 'object') {
                for (var q in _er) {
                    err += q + ' = "' + _er[q] + '"; ';
                }
            } else if (typeof(_er) == 'undefined') {
                err += _er + '; ';
            }
            console.log(err);
            //if(callback) callback();
            return false;
        },
        query : function (sql, callback, params, er) {
            if (!this._db)
                return false;
            var self = this;
            function _er(tx, __er) {
                __er = jQuery.extend(__er, {
                        sql : sql
                    });
                if (er)
                    er(tx, __er);
                else
                    self.callback_error(tx, __er);
            };
            this._db.transaction(function (tx) {
                tx.executeSql(sql, (params ? params : []), callback, _er);
            }, _er);
        },
        update : function (tbl, sets, clauses, callback) {
            var __sql = 'UPDATE ' + tbl,
            _field = null,
            __set = '',
            __clause = '',
            __values = [];
            
            for (var i = 0; i < sets.length; i++) {
                0
                _field = sets[i];
                for (var j = 0; j < _field.length; j++) {
                    __set += ',`' + _field[j].name + '`=?';
                    __values.push(_field[j].value);
                }
            }
            
            for (var i = 0; i < clauses.length; i++) {
                __clause += ',`' + clauses[i].name + '`=?';
                __values.push(clauses[i].value);
            }
            __sql += ((__set != '') ? ' SET ' + __set.substr(1) : '') + ((__clause != '') ? ' WHERE ' + __clause.substr(1) : '') + ';';
            this.query(__sql, callback, __values);
            return true;
        },
        remove : function (tbl, clauses) {
            var __sql = 'DELETE FROM ' + tbl,
            __clause = '';
            
            for (var i = 0; i < clauses.length; i++)
                __clause += ',`' + clauses[i].name + '`="' + escape(clauses[i].value) + '"';
            
            __sql += ' WHERE ' + ((__clause != '') ? __clause.substr(1) : 'FALSE') + ';';
            
            this.query(__sql);
            return true;
        },
        multiInsert : function (tbl, rows, callback, er) {
            if (!this._db)
                return false;
            var self = this;
            var __sql = '',
            _field = null,
            __field = '',
            __qs = [],
            __values = [];
            
            this._db.transaction(function (tx) {
                for (var i = 0; i < rows.length; i++) {
                    __qs = [];
                    __values = [];
                    __field = '';
                    _field = rows[i];
                    
                    for (var j = 0; j < _field.length; j++) {
                        __field += ',`' + _field[j].name + '`';
                        __qs.push('?');
                        __values.push(_field[j].value);
                    }
                    tx.executeSql('INSERT INTO ' + tbl + ' (' + __field.substr(1) + ') VALUES(' + __qs.join(',') + ');', __values, function () {
                        return false;
                    }, (er ? er : self.callback_error));
                }
            }, self.callback_error, function () {
                if (callback)
                    callback();
                return true;
            });
            return true;
        },
        insert : function (tbl, rows, callback) {
            var __sql = '',
            _field = null,
            __field = '',
            __qs = [],
            __values = [],
            __debug = '';
            
            for (var i = 0; i < rows.length; i++) {
                __qs = [];
                __field = '';
                _field = rows[i];
                
                __debug += _field[0].name + ' = ' + _field[0].value + ';';
                for (var j = 0; j < _field.length; j++) {
                    __field += ',`' + _field[j].name + '`';
                    __qs.push('?');
                    __values.push(_field[j].value);
                }
                __sql += 'INSERT INTO ' + tbl + ' (' + __field.substr(1) + ') VALUES(' + __qs.join(',') + ');';
            }
            this.query(__sql, callback, __values);
            return true;
        },
        insertReplace : function (tbl, rows, debug) {
            var __sql = '',
            _field = null,
            __field = '',
            __qs = [],
            __values = [],
            __debug = '';
            
            for (var i = 0; i < rows.length; i++) {
                __qs = [];
                __field = '';
                _field = rows[i];
                
                __debug += _field[0].name + ' = ' + _field[0].value + ';';
                for (var j = 0; j < _field.length; j++) {
                    __field += ',`' + _field[j].name + '`';
                    __qs.push('?');
                    __values.push(_field[j].value);
                }
                __sql += 'INSERT OR REPLACE INTO ' + tbl + ' (' + __field.substr(1) + ') VALUES(' + __qs.join(',') + ');';
            }
            this.query(__sql, null, __values);
            return true;
        },
        dropTable : function (tbl, callback) {
            var __sql = '';
            if (tbl == null)
                return false;
            __sql = 'DROP TABLE IF EXISTS ' + tbl;
            this.query(__sql, callback);
            return true;
        }
    }
    return jQuery.extend(ret, confs);
}















/*=======================================*/
使用方法:
/*=======================================*/

/*=======================================*/
创建数据库:
/* Create or open database with 'websiteDB' as database name and 'website DB' as title, and database site is 5MB */
/* I'm not using 1024 for the size multiplying because i don't want to be near at the margin size                          */
var db = new cDB({
        _db : window.openDatabase("websiteDB", "", "website DB"; , 5 * 1000 * 1000)
    });

/*=======================================*/
建表 :
/* dbTable is database structure in this example, and contains 2 tables 'foo' and 'boo' */
/* and also the table structure in table properties                                                           */
var dbTable = [{
        table : 'foo',
        properties : [{
                name : 'foo_id',
                type : 'INT PRIMARY KEY ASC'
            }, {
                name : 'foo_field_1',
                type : ''
            }, {
                name : 'foo)field_2',
                type : ''
            }
        ]
    }, {
        table : 'boo',
        properties : [{
                name : 'boo_id',
                type : 'INT PRIMARY KEY ASC'
            }, {
                name : 'boo_field_1',
                type : ''
            }, {
                name : 'boo_field_2',
                type : ''
            }
        ]
    }
];

/* this line is checking if the database exist or not and then create the database structure.  */
/* table will be created if the table is not exist yet, if the table already exist, it will skip the */
/* table and continue with others tables                                                                                  */
if (!db.check(dbTable)) {
    db = false;
    alert('Failed to cennect to database.');
}

/*=======================================*/
删除表:
db.dropTable('foo');

/*=======================================*/
插入数据:
var row = [];
row.push([{
            'name' : 'foo_id',
            'value' : 1
        }, {
            'name' : 'foo_field_1',
            'value' : 'value 1 field_1'
        }, {
            'name' : 'foo_field_2',
            'value' : 'value 1 field_2']
        }
    ]);
db.insert('foo', row);

插入多行记录:
/*
SQLite is not accepting more than 1 line statement,
that is the reason why we not able to do more than one statement query, like insertion.
If you want to insert more than 1 record at the time, you need to use this function.
 */
var rows = [];
rows.push([{
            'name' : 'boo_id',
            'value' : 1
        }, {
            'name' : 'boo_field_1',
            'value' : 'value 1 field_1'
        }, {
            'name' : 'boo_field_2',
            'value' : 'value 1 field_2']
        }
    ]);
rows.push([{
            'name' : 'boo_id',
            'value' : 2
        }, {
            'name' : 'boo_field_1',
            'value' : 'value 2 field_1'
        }, {
            'name' : 'boo_field_2',
            'value' : 'value 2 field_2']
        }
    ]);
db.multiInsert('boo', rows, function () {
    alert('insertion done');
});

/*
如果想合并insert 和 multiInsert两个函数,可以按下面的方法增加一个判断来处理
 */

if (rows.length >= 2) {
    db.multiInsert('boo', rows, function () {
        alert('insertion done');
    });
} else {
    db.insert('boo', rows);
}

/*=======================================*/
删除数据:
db.remove('boo', [{
            'name' : 'boo_id',
            'value' : 1
        }
    ])

/*=======================================*/
更新数据
db.update('boo', [[{
                'name' : 'boo_id',
                'value' : 2
            }, {
                'name' : 'boo_field_1',
                'value' : 'boo value'
            }
        ]], ['name' : 'boo_id', 'value' : 2])

/*=======================================*/
查询
var query = 'SELECT * FROM foo';
db.query(query, function (tx, res) {
    if (res.rows.length) {
        alert('found ' + res.rows.length + ' record(s)');
    } else {
        alert('table foo is empty');
    }
});