PhoneGap 數據庫操做

1,openDatabase

phonegap官方文檔中已經很清楚的標明,若是使用一個數據庫首先要用window對象進行建立:javascript

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

參數:html

  • name:標明數據庫的名稱
  • version:版本號
  • display_name:顯示名稱,與name的區別在於數據庫表中,分別有這兩個字段。
  • size:數據庫的大小

詳解:html5

以前,在利用工廠模式,建立了一個數據庫對象:java

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

.......數據庫

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

_db.transaction();app

}函數

調用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文件夾;裏面建立一個Databases.db數據庫文件,會在這個數據庫文件中建立兩個表:Databases和Origins;Databases存放在建立數據庫時,填寫的參數信息,Origins中存放數據庫文件夾路徑

圖1:Databases數據庫中的兩個表


圖2:Databases表


 

 

 Databases表中建立的數據庫文件夾路徑(origin字段)和文件路徑(path字段),默認第一次建立是在file__0/ 0000000000000001.db.這個纔是咱們真正建立的數據庫文件。你調用數據庫對象進行數據庫操做都是在這個數據庫下進行的。

當咱們指定的數據庫不存在時會幫咱們新建一個數據庫,當存在了只會返回一個已有的數據庫對象。

2,SQLTransaction對象

該對象是用來操做executesql方法;

執行transaction方法,在接受一個SQLTransaction對象的同時,它還會執行其中的回調函數:

db.transaction(populateDB, errorCB, successCB);

當你調用Databases對象的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); 
}

 

轉自:http://www.cnblogs.com/mingforyou/archive/2013/01/29/2881795.html

相關文章
相關標籤/搜索