zoukankan      html  css  js  c++  java
  • (转)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);

  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/allearner/p/3726514.html
Copyright © 2011-2022 走看看