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);
}