2015年9月7日 星期一

Codova + SQLite

 SQLite 是免費資料庫軟體,也可以跨平台(windows/Linux) ,當然手機也內建,但是和NOSQL概念不同喔,仍是關聯式資料庫,不少codova 會結合SQLite做一些APP的應用,以下範例教學剛好有使用到SQLite 也提供大家一些參考

一、建立SQLite 的函式庫 :寫成獨立的核心SQL元件

var db;
var sqlList = {
    openDB:function myfunction(dbName) {
        db = window.openDatabase("Database", "1.0", dbName, 1000);
        return db;
    },
    executeSQL: function myfunction(db, sqlcommand,  returnSuccessHandler) {
        //宣告 returnSuccessHandler 函式
       db.transaction(selectDBTransactionSuccessHandler,
               errorHandler, function () { });
        function selectDBTransactionSuccessHandler(sqlTransaction) {
            sqlTransaction.executeSql(sqlcommand, [], successHandler, errorHandler);
        };
        function successHandler(sqlTransaction, sqlResultSet) {
//呼叫 returnSuccessHandler 函式 回傳結果
            returnSuccessHandler(sqlResultSet.rows);
        }
        function errorHandler(errorCode) {
            console.log("executeSQL" + " sql: error");
            console.log(errorCode.err);
        };
    },
    executeNonQuery: function executeQuery(db, sqlcommand) {
        db.transaction(function (tx) {
            tx.executeSql(sqlcommand, [], function () { }, errorHandler);
        }, function errorCB(err) {
            alert("error");
            console.warn("Error processing SQL: " + err.code);
        }, function () {
        });

        function errorHandler(err) {
            alert("無法執行sql指令!" +sqlcommand + "錯誤碼" + err.code);
        }
    },
    executeNonQueryWithID: function (db, sqlcommand, id) {
        db.transaction(function (tx) {
            tx.executeSql(sqlcommand, [id], function () {
            });
        }, function errorCB(err) {
            alert("error");
            console.warn("Error processing SQL: " + err.code);
        }, function () {
        });
    }
};

executeSQL: function myfunction(db, sqlcommand,  returnSuccessHandler):
要將SQLite執行的結果回傳,需要有一個函式負責接收回傳值,所以returnSuccessHandler 是函數名稱,而非變數名稱,透過此函式回傳結果。

二、新增、刪除、修改等操作

新增資料庫
  var db =sqlList.openDB("clinicDatabase"); //開啟資料表

新增資料表
sqlList.executeNonQuery(db, "CREATE TABLE  IF NOT EXISTS  clinics (id INTEGER PRIMARY KEY AUTOINCREMENT, clinicName TEXT, clinicIP TEXT, user TEXT, password TEXT)");

刪除資料表
sqlList.executeNonQuery(db, "DROP  TABLE  IF EXISTS  clinics ");

新增資料
var sqlValue = "INSERT INTO clinics (clinicName,clinicIP,user,password) VALUES('" + clinicName + "'," + "'" + clinicIP + "','" + user + "','" + password + "')";

刪除資料
  sqlList.executeNonQueryWithID(db, "delete from clinics where id=?", id);

執行SQL的查詢語法
var db =sqlList.openDB("clinicDatabase"); //開啟資料表
   sqlList.executeSQL(db, "select * from clinics",  function (readData) {
       //查詢的資料回傳值… 
        $("#settingPage_clinicName").val(readData.item(0).clinicName);
         $("#settingPage_clinicIP").val(readData.item(0).clinicIP);
         $("#settingPage_user").val(readData.item(0).user);
         $("#settingPage_password").val(readData.item(0).password);
});
   

    將SQLite的執行SQL的共同函式變成物件,程式是不是變得簡潔許多呢? 因為在codova 呼叫sqlLite 會以非同步結果回應傳回值,所以要在function () {} 內才能接受回覆的值,希望這對大家有所幫助~ 感謝各位蒞臨。 

沒有留言:

張貼留言