原文: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);

(转)phonegap 数据库详解的更多相关文章

  1. SQLServer 远程链接MySql数据库详解

    SQLServer 远程链接MySql数据库详解 by:授客 QQ:1033553122 测试环境: Microsoft Windows XP Professional 版本2000 Service ...

  2. JAVA通过JDBC连接Oracle数据库详解【转载】

    JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...

  3. intelliJ IDEA 配置MySQL数据库 详解

    1> 在主界面中,点击右边侧栏的 Database ,在点击 + ,再Data Source 选择数据库   2> 填入 Database 数据库名,在输入 User 和 Password ...

  4. MongoDB数据库详解

    第1章 数据库管理系统 1.1 前言 01.数据的定义:文字.图像.地理位置信息(坐标.经纬度)等 02.数据库管理系统的定义:建立.存取和管理数据,保证数据安全和完整性的软件 03.常见的数据库管理 ...

  5. mysql数据库 详解 之 自学成才1

    一.学习目录 1.认识数据库和mysql 2.mysql连接 3.入门语句 4.详解列类型 5.增删改查 INSERT INTO  表名(列1,……  列n)  VALUES(值 1,……  值 n) ...

  6. Log4j写入数据库详解

    log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...

  7. mysql数据库 详解

    一.学习目录 1.认识数据库和mysql 2.mysql连接 3.入门语句 4.详解列类型 5.增删改查 INSERT INTO  表名(列1,……  列n)  VALUES(值 1,……  值 n) ...

  8. Jmeter操作MySQL数据库详解

    一.jmeter操作数据库的原理 jmeter不可直接操作数据库,必须通过驱动程序来间接操作,但如果数据库不是在本地而是云服务器上的话就需要通过网络来操作. jmeter通过驱动程序来完成对MySQL ...

  9. 使用DOS访问数据库详解

    今天突发奇想,想是否可以用DOS命令来操作本地数据库或者连接其他外地数据库,网上搜了很多教程比较繁琐,自己想写一篇文章详细叙述一下,也为以后复习做点备份. 工具: 电脑 win7 64bit MySQ ...

随机推荐

  1. css3中clip属性

    clip 属性用来设置元素的形状.用来剪裁绝对定位元素. 当一幅图像的尺寸大于包含它的元素时,"clip" 属性允许规定一个元素的可见尺寸,这样此元素就会被修剪并显示在这个元素中. ...

  2. 《Java程序设计》实验五 实验报告

    实验五 java网络编程 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2. ...

  3. JavaScript中给对象添加函数的方式

    1. function 类名(){ this.属性: } var 对象名=new 类名(): function 函数名(){ //执行代码 } 对象名.属性名=函数名: 对象名.属性名(): func ...

  4. 11 自定制shell提示符

    shell提示符  huiubantu@ubuntu:~$ shell提示符保存在PS1变量中 包括用户名,主机名,当前工作目录 可以通过echo命令查看PS1的内容 huiubantu@ubuntu ...

  5. 3.7 嵌入式SQL

    可以放入所有高级语言中去,如C 因为,SQL是过程性语句,需要高级语言的非过程性处理集合的分类处理 一.一般形式 所有的SQL语句都必须加前缀EXEC SQL SQL语句完成结束标志(:或END EX ...

  6. 5月25日 DOM

    练习一:输入答案,弹出是否正确. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  7. ASP.NET Web API中的依赖注入

    什么是依赖注入 依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型如下: namespace Pattern.DI ...

  8. thinkjs——空对象判断

    使用thinkjs来做后台的项目开发时,总免不了进行一些数据的唯一性校验,比如说:有这么一个页面,需要对钢厂的名称做一个校验,于是自己在后台做条件搜索时,一不小心用到了两种方法: 一个是find(), ...

  9. 百度Tera数据库介绍——类似cassandra,levelDB

    转自:https://my.oschina.net/u/2982571/blog/775452 设计背景 百度的链接处理系统每天处理万亿级的超链数据,在过去,这是一系列Mapreduce的批量过程,对 ...

  10. synchronized和static synchronized的比较

    群里讨论的一个问题,网上别人已经贴出了很详细的说明,这里补充记录下,后面加入个人测试代码. 起因:1月份的时候看群里讨论一道问题,问题内容如下: 一个日本作者-结成浩的<java多线程设计模式& ...