PhoneGap 數據庫操作


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 中與存儲相關的對象有
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<len; 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 onclick="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<len; 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); 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM