zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

PhoneGap 数据库操作详解编程语言

数据库编程语言 详解 操作 PhoneGap
2023-06-13 09:20:39 时间
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数据库中的两个表

PhoneGap 数据库操作详解编程语言

 

 

 

图2:Databases表

PhoneGap 数据库操作详解编程语言

 

 

 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 中与存储相关的对象有
Database 数据库对象
SQLTransaction 事物对象
SQLResultSet Sql结果对象
SQLResultSetList 查询返回数据集对象
SQLError Sql错误对象
localStorage 本地存储对象

 

Database 数据库对象:
通过openDatabase方法获得该对象
例如:
window.openDatabase(database_name, database_version, database_displayname, database_size);

 

var dbOne = window.openDatabase( test1 , 1.0 , Test DB , 1000000);

 

database_name:数据库名字,
database_version:数据库版本
database_displayname:显示名字
database_size:数据库大小

 

创建完成后便会在/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 i++){
console.log( Row = + i + ID = + results.rows.item(i).id + Data = + results.rows.item(i).data);
}
}

localStorage本地存储对象

该对象和手机设备上的存储没有关系,而是和html5中的本地存储提供的一个接口

一个完整的例子

html部分

!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN  
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd  
html xmlns= http://www.w3.org/1999/xhtml  
head  
title new document /title  
/head  
body  
button #8221;pgapStorage() pgapStorage /button  
/body  
script type= text/javascript src= cordova-2.1.0.js /script  
script type= text/javascript src= pgapstorage.js /script  
/html

js部分

function pgapStorage(){ 
//创建或者打开数据库,大小100000 bytes 
var dbOne = window.openDatabase( myDataBase , 1.0 , phonegapdatabase ,100000); 

//将事物对象SQLTransaction传给createATable函数,如果发生错误将SQLError对象传给errorCreateTable函数 
dbOne.transaction(createATable, errorCreateTableTrans, successCreateTableTrans); 

//执行回调函数createATable,创建表MyTab并且插入数据 
function createATable(trans){ 
trans.executeSql( DROP TABLE IF EXISTS MyTab ); 
trans.executeSql( CREATE TABLE IF NOT EXISTS MyTab (id unique, data) ); 
trans.executeSql( INSERT INTO MyTab (id, data) VALUES (1, First row ) ); 
trans.executeSql( INSERT INTO MyTab (id, data) VALUES (2, Second row ) ); 

//dbOne.transaction()执行失败后执行,并传递SQLError对象 
function errorCreateTableTrans(err){ 
alert( err code: +err.code+ err message: +err.message); 


//dbOne.transaction()执行成功后会执行 

function successCreateTableTrans(){ 
alert( successfully ); 
var dbOne = window.openDatabase( myDataBase , 1.0 , phonegapdatabase ,100000); 
//创建新的事物对象,并传递给回调函数 
dbOne.transaction(queryMyTab,successQueryMyTabTrans,errorQueryMyTabTrans); 


function successQueryMyTabTrans(){ 
alert( successQueryMyTabTrans ); 

function errorQueryMyTabTrans(){ 
alert( err code: +err.code+ err message: +err.message); 

//查询 
function queryMyTab(trans){ 
//查询成功后执行successQueryMyTab回调函数,失败执行errorQueryMyTab函数 
trans.executeSql( SELECT * FROM MyTab , [], successQueryMyTab, errorQueryMyTab); 

//executeSql执行成功后执行,并将SQLTransaction、SQLResultSet两个对象传递给函数 successQueryMyTab 
function successQueryMyTab(trans,results){ 
var len = results.rows.length; 
alert(len); 
//利用弹出框显示查询的结果 
for (var i=0; i i++){ 
alert( Row = + i + ID = + results.rows.item(i).id + Data = + results.rows.item(i).data); 


//executeSql()执行失败后执行 
function errorQueryMyTab(err){ 
alert( err code: +err.code+ err message: +err.message); 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13399.html

cjavaxml