phonegap官方文檔中已經很清楚的標明,若是使用一個數據庫首先要用window對象進行建立:javascript
var dbShell = window.openDatabase(name, version, display_name, size);css
參數:html
詳解: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.這個纔是咱們真正建立的數據庫文件。你調用數據庫對象進行數據庫操做都是在這個數據庫下進行的。
當咱們指定的數據庫不存在時會幫咱們新建一個數據庫,當存在了只會返回一個已有的數據庫對象。
該對象是用來操做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,對象中的屬性
參考文檔中的例子: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);
}
包含SQL查詢所返回的全部行數據。
屬性:
方法:
總結:
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