第一篇技術博客,寫下來和大家分享今天所學,其次自己也鞏固一下。
整個下午的時間用來鑽研如何用cordova調用移動端本地SQLite數據庫。首先我並不是用eclipse來編程的,而是用cordova建立project后直接用notepad編輯www下的index文件。
一、cordova的下載安裝和建立project的方法
該部分不是文章重點,抽空另開一篇文章詳細介紹。官網上有相關教程:http://cordova.apache.org/docs/en/5.0.0/guide_cli_index.md.html#The%20Command-Line%20Interface(插一句,測試時盡量用真機,虛擬機實在太慢)
二、插件下載
調用SQLite需要使用cordova的插件cordova-sqlite-storage,下載方法為在所建的project目錄下打開cmd,輸入cordova plugin add cordova-sqlite-storage回車。
三、插件的使用
參考資源:https://www.npmjs.com/package/cordova-sqlite-storage
使用sqlite數據庫的基本步驟
(1)建立連接
有兩種方法可用來創建並打開對數據庫的一個連接:
var db = window.sqlitePlugin.openDatabase({name: "my.db"}); //my.db表示數據庫名稱
var db = window.sqlitePlugin.openDatabase("myDatabase.db", "1.0", "Demo", -1); //myDatabase.db代表數據庫名稱,1.0是版本號,Demo是描述信息,第四個參數參考其他資料應該是預估數據庫大小,-1代表什么自己也沒搞懂,請大神指點。
(2)執行SQL操作
使用db.transaction()方法來執行一個SQL操作,該方法只有一個參數。該參數是一個函數,並且通常是匿名的,可以直接定義在db.transaction()中。如:
db.transaction(function(tx)
{
...
});
這個匿名函數具有一個事務類型的參數tx,它是一個事務對象,該事物對象具有一個方法:executeSql(),使用該方法可以執行SQL語句。
該方法有四個參數,其中后三個參數是可選的:
- 查詢字符串
- 替換參數化查詢中的占位符的數據
- SQL執行成功時調用的回調函數
- SQL執行失敗時調用的回調函數
例如下面的代碼,同時定義了四個參數:
tx
(3)對結果進行處理
3.1 當SQL操作執行成功時回執行一個回調函數,即上文中的funciton1,該函數有兩個參數,一個是執行他的事物對象tx,另一個是操作返回的結果res(下面會詳細介紹),即:
function function1(tx,res)
{
...
}
3.2當SQL操作失敗時就會調用function2,該函數也有兩個參數,一個是tx,另一個是錯誤對象,通過該錯誤對象可以獲知具體的錯誤信息:
function function2(tx,err)
{
alert(err.message);
}
3.3 成功使用executeSql()方法執行的SQL語句可以返回一個執行結果即上文中的res,該執行結果回作為回調函數的一個參數。
執行結果是一個SQLResultSet對象,由SQLResultSet接口定義:
interface SQLResultSet{
readonly attribute long insertId;
readonly attribute long rowsAffected;
readonly attribute SQLResultRowList rows;
};
1、屬性insertId返回記錄行的行ID,每個SQL INSERT插入操作會自動插入一個行ID,如果插入多行,則該屬性返回最后一行的行ID;如果不存在記錄行則調用該屬性時拋出INVALID_ACCESS_ERR異常。
2、屬性rowsAffect返回SQL語句所改變的記錄行的行數,如果沒有任何改變,則該屬性返回0;
3、屬性rows 返回一個SQLResultList 對象,表示返回的所用記錄行,結果按照數據庫中的序列排列,如果沒有數據,則返回空對象,即SQLResultList.length屬相值為0;
SQLResultList對象由SQLResultList 接口定義:
interface SQLResultSetRowList{
readonly attribute unsigned long length;
getter any item(in unsigned long index);
};
1、屬性length表示返回記錄行的總行數。
2、item(x)方法根據索引號x獲取一個指定的行(下標從0開始)。如果不存在指定的索引號,則該方法返回null。
一行就是一個javascript Object類型的對象,每個記錄行的屬性名相當於對象的屬性名,例如row={id:0,data:“test”,data_num:100},使用對象語法可以獲取每個屬性的值,如row["data"](記得加引號)。
整體代碼如下:
在手機上顯示結果為:
data_num=100
data=test
id=0
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <script src="cordova.js" type="text/javascript"></script> 6 <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css"> 7 <script src="http://code.jquery.com/jquery-1.10.2.js"></script> 8 <script src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></script> 9 <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css"> 10 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css"> 11 <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script> 12 </head> 13 <body> 14 <script> 15 document.addEventListener("deviceready", onDeviceReady, false); 16 17 function onDeviceReady() { 18 var db = window.sqlitePlugin.openDatabase("Database", "1.0", "Demo", -1); 19 20 db.transaction(function(tx) { 21 tx.executeSql('DROP TABLE IF EXISTS test_table'); 22 tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)'); 23 24 tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["test", 100], function(tx, res) { 25 tx.executeSql("select * from test_table", [], function(tx, res) { 26 alert("hello world"); 27 var row=res.rows.item(0); 28 for(var j in row){ 29 document.write(j+"="+row[j]+"<br />"); 30 } 31 }); 32 }, function(e) { 33 alert("ERROR: " + e.message); 34 }); 35 }); 36 } 37 </script> 38 </body> 39 </html>