• (转)phonegap 数据库详解


    原文:http://firepix.iteye.com/blog/1618343

    phonegap 数据库详解          博客分类:

    今天就把之前使用phonegap的一些见解和疑惑写出来,以便于自己以后查看,有兴趣的同学也可以那去查看,可以做一些参考,本人也是刚学习,所以其中有引起分歧的部分,可以直接的进行斧正,也可邮箱我:zygmain@gmail.com(or:935517644QQ)

    1,openDatabase

    phonegap官方文档中已经很清楚的标明,如果使用一个数据库首先要用window对象进行创建:

    var dbShell = window.openDatabase(name, version, display_name, size);

    参数:

    • name:标明数据库的名称
    • version:版本号
    • display_name:显示名称,与name的区别在于数据库表中,分别有这两个字段。
    • size:数据库的大小

     详解:

    之前,在利用工厂模式,创建了一个数据库对象:

    function db(name,ver,dis,size){

    .......

    var _db = window.openDatabase(name,ver,dis,size);

    _db.transaction();

    }

    调用function方法进行创建db对象时,new db(),里面传入的参数可以是需要的四个参数,但是,我用下面这个方法的时候就遇到了一个问题,先看方法:

    var newdb = {

    _db:'',

    db:function(){

    if(!newdb._db){

    newdb._db  = window.openDatabase("database","1.0","mydatabase",10000);

    return new db(newdb._db);

    }

    }

    }

    疑惑:在进行调用工厂类创建数据库的时候,传入的参数竟然可以不是给定的四个参数,而是直接的传入了一个数据库对象;并且当获取到从工厂类中生成的数据库对象,其中也存在一个_db,两个数据库,究竟在执行transaction事务的时候调用的是哪一个?

    上面说了这么多,都是为了铺陈:

    其中的过程是这样的:

    //首先程序会为当前应用在data文件夹下创建一个以当前应用包名的文件夹

    //当运行window.openDatabase方法后,会在该文件夹下创建一个app_database文件夹;里面创建一个Database.db数据库文件,会在这个数据库文件中创建两个表:Database和Origins;Database存放在创建数据库时,填写的参数信息,Origins中存放数据库文件夹路径

    图1:Database数据库中的两个表

    图2:Databases表

     Databases表中创建的数据库文件夹路径(origin字段)和文件路径(path字段),默认第一次创建是在file__0/ 0000000000000001.db.这个才是我们真正创建的数据库文件。你调用数据库对象进行数据库操作都是在这个数据库下进行的。

    当我们指定的数据库不存在时会帮我们新建一个数据库,当存在了只会返回一个已有的数据库对象。

    2,SQLTransaction对象

    该对象是用来操作executesql方法;

    执行transaction方法,在接受一个SQLTransaction对象的同时,它还会执行其中的回调函数:

    db.transaction(populateDB, errorCB, successCB);

    当你调用Database对象的transaction方法后,其回调函数将被调用并接收一个SQLTransaction对象。用户可以通过SQLTransaction对象多次调用executeSql来建立一个数据库事务处理。

    function populateDB(tx) {
    	tx.executeSql('DROP TABLE DEMO IF EXISTS');
    	tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    	tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    	tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
    }
    
    function errorCB(err) {
       	alert("Error processing SQL: "+err);
    }
    
    function successCB() {
       	alert("success!");
    }
    
    var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(populateDB, errorCB, successCB);

    3,SQLResultSet对象

    执行executesql方法,返回对象:SQLResultSet,对象中的属性

    • insertId:SQLResultSet对象通过SQL语句插入到数据库的行记录的行ID。[译注:如果插入多行的时候,返回最后一个行的ID]
    • rowAffected:被SQL语句改变的记录行数,如果语句没有影响任何行则设置为0。
    • rows:是一个SQLResultSetRowList对象,表示返回的多条记录。如果没有返回任何记录,则此对象为空。

     

    SQLResultSet对象可以在执行executesql的成功回调函数中获取到:

    参考文档中的例子:tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);

    第一个参数为要执行的数据库语句。与普通操纵数据库语句没太大区别。

    第二个参数为一个数组对象,存放sql语句中需要的参数的数组,就是sql语句里面出现的?所需要的参数。

    第三个参数为执行成功后,调用的方法,在这个函数中可以获取到结果集results.是一个sqlresultset对象

    第四个参数为执行错误时候调用的方法。

    接下来我们看一下querySuccess这个回调方法。

    function querySuccess(tx, results) {

           // 因为没有插入记录,所以返回值为空

           console.log("Insert ID = " + results.insertId);

           // 因为这是一条查询语句所以返回值为0

           console.log("Rows Affected = " + results.rowAffected);

           // 返回查询到的记录行数量

           console.log("Insert ID = " + results.rows.length);

    }

    4,SQLResultSetList对象

     

    包含SQL查询所返回的所有行数据。

    属性:

    • length: SQL查询所返回的记录行数。

    方法:

    • item:根据指定索引返回一个行记录的JavaScript对象。

    总结:

    db.transaction(SQLTransaction,err,sucss);

    SQLResultSet = SQLTransaction.executesql("select * from",[],succ,err);

    SQLResultSetList = SQLResultSet.rows;

    item = SQLResultSetList.item(i);

  • 相关阅读:
    结对开发:电梯调度(2)
    小组站立会议
    小组站立会议
    小组站立会议
    小组站立会议4月15日
    小组站立会议
    小组站立会议
    团队个人每天详细计划汇总
    Spring冲刺计划会议
    团队项目开发
  • 原文地址:https://www.cnblogs.com/allearner/p/3726514.html
Copyright © 2020-2023  润新知