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  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值