操作sqlite的JavaScript類

cn55 9年前發布 | 2K 次閱讀 JavaScript

/*/
/ 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'); } });</pre>

 本文由用戶 cn55 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!