js操作android-sqlite數據庫

/*************************************/

/*db.js                             */

/* SQLite Database Class For HTML5 */

/*************************************/

/*Database 數據庫對象

SQLTransaction   事物對象

SQLResultSet Sql結果對象

SQLResultSetList 查詢返回數據集對象

SQLError Sql錯誤對象

localStorage 本地存儲對象

創建完成後便會在/data/data/包名/app_database/dbOne.db找到剛纔創建的數據庫文件,可以利用DDMS查看

SQLTransaction   事物對象

phonegap沒有提供直接獲取事物對象的方法,而是利用Database 對象transaction方法,將事物對象傳遞給一個回調

函數,例如

dbOne.transaction(createATable, errorCreateTable, successCreateTable);

createATable即是一個回調函數,會將事物對象以參數的形式傳進去,createATable函數

createATable(trans){

}

這裏的trans即是傳遞進的事物對象,有了事物對象就可利用事物對象的executeSql方法執行sql語句

例如

createATable(trans){

trans.executeSql('CREATE TABLE IF NOT EXISTS MyTab (id unique, data)');

tx.executeSql('INSERT INTO MyTab (id, data) VALUES (1, "First row")');

tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');

}

這樣就利用數據庫的事物對象創建了MyTab表並且插入了兩條數據

SQLError 錯誤對象

SQLError對象也是以參數的形式傳遞給一個回調函數

在上面的方法

dbOne.transaction(createATable, errorCreateTable, successCreateTable);

errorCreateTable就是一個回調函數,如果dbOne.transaction函數執行失敗,就會調用回調函數errorCreateTable

同時將SQLError對象傳遞進去

例如

function errorCreateTable(err)

{

alert("err code:"+err.code+"err message:"+err.message');

}

code和message爲SQLError對象的兩個屬性

SQLResultSet對象

該對象是由事物對象的executeSql方法傳遞給回調函數,在回調函數中在對結構集對象操作,例如

 tx.executeSql('SELECT * FROM MyTab', [], querySuccess, errorCB);

querySuccess即是成功執行後的回調函數,

function querySuccess(trans, results) {

alert("Returned rows = " + results.rows.length);

if (!resultSet.rowsAffected) {

  alert('No rows affected!');

  return false;

}

該函數接受兩個參數:事物對象和結果集對象SQLResultSet,SQLResultSet包含三個屬性

insertId 函數插入數據行的row ID

rowsAffected  改變的數據行的數量

rows:rows是一個SQLResultSetList 對象,該對象代表執行查詢sql時返回的所有數據行

SQLResultSetList 查詢返回的結果集對象

該對象包含一個屬性 length(返回的數據行數量),一個方法item(該方法返回某個特定的數據行0

 function querySuccess(trans, results) {

        var len = results.rows.length;

        console.log("MyTab table: " + len + " rows found.");

        for (var i=0; i<len; i++){

            console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i).data);

        }

    }

*/

//下面是某高手封裝的js操作SQLITE數據庫的‘類’,如果有看不懂的,回頭看看SQLTransaction   ,SQLResultSet Sql,SQLResultSetList ,SQLError Sql這四個對象的介紹

function cDB(confs) {

    var ret = {        //JS類的又一種實現方式,返回值作爲一個函數對象。

        _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, nullnullnull);

            }

            

            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) {//雖然說是query,其實執行所有的SQL語句

            if (!this._db)

                return false;

            var self = this;

            function _er(tx, __er) {   //這個函數算得上是私有函數了,外部是沒辦法訪問的

                __er = jQuery.extend(__er, {

                        sql : sql

                    });  //給__er對象擴展sql屬性

                if (er)  //如果er函數存在則調用此函數 

                    er(tx, __er);

                else       //否則調用本“類”的錯誤處理回調函數

                    self.callback_error(tx, __er);

            };

            this._db.transaction(function (tx) {  //tx是一個事物對象SQLTransaction,這個匿名回調函數的形參

                tx.executeSql(sql, (params ? params : []), callback, _er);

            }, _er);//_er是一個transaction函數出錯的回調函數,SQLTransaction和SQLError對象也是以參數的形式傳遞給_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", 1000)

});


//1000byte是小了點,太大的話也許手機容量不夠用

/*

=======================================

建表 :

 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      */  

db.dropTable('foo');

db.dropTable('boo');

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' : 2

        }, {

            'name' : 'boo_field_1',

            'value' : 'value 2 field_1'

        }, {

            'name' : 'boo_field_2',

            'value' : 'value 2 field_2' 

        }

    ]);

rows.push([{

            'name' : 'boo_id',

            'value' : 3

        }, {

            'name' : 'boo_field_1',

            'value' : 'value 3 field_1'

        }, {

            'name' : 'boo_field_2',

            'value' : 'value 3 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');

    }

}); 


編譯測試成功,phonegap+jquery mobile    ANDOIRD OS:2.3.3  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章