qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          移動前端開發(fā)之?dāng)?shù)據(jù)庫操作篇

           在移動平臺開發(fā)中,經(jīng)常會有大數(shù)據(jù)存儲與交互的操作,在以webkit為內(nèi)核的瀏覽器中,提供了一個叫作WEBSQL的數(shù)據(jù)庫。這讓我們前端也可以像php等程序語言一樣,進行數(shù)據(jù)庫的讀寫操作。Web Storage存儲本地數(shù)據(jù)的方法目前可以在許多主流瀏覽器、平臺與設(shè)備上實現(xiàn),與之相關(guān)的API也已經(jīng)標(biāo)準(zhǔn)化,但是,Web Storage存儲空間是有5MB,鍵值存儲的方式帶來諸多不便,未來本地存儲也不僅僅是這一種方法。其中最為熟知的就是Web SQL數(shù)據(jù)庫,它內(nèi)置SQLite數(shù)據(jù)庫,對數(shù)據(jù)庫的操作可以通過調(diào)用executeSql()方法實現(xiàn),允許使用JavaScript代碼控制數(shù)據(jù)庫。這樣一來,前端應(yīng)用就有了一個更為廣闊的天空。
            打開與創(chuàng)建數(shù)據(jù)庫
            如果要通過WebDb進行本地數(shù)據(jù)的存儲,首先需要打開或創(chuàng)建一個數(shù)據(jù)庫,打開或創(chuàng)建數(shù)據(jù)庫的API是openDatabase,其調(diào)用的代碼如下所示:
            openDatabase(DbName,DBVersion,DBDescribe,DBSize,Callback());
            參數(shù)分別表示數(shù)據(jù)庫名稱,版本號,描述,數(shù)據(jù)庫大小(字節(jié)為單位),創(chuàng)建或打開成功后執(zhí)行的回調(diào)函數(shù)。
            主要用到的有如下三個方法:
            1、openDatabase:這個方法使用現(xiàn)有數(shù)據(jù)庫或創(chuàng)建新數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫對象。
            2、transaction:這個方法允許我們根據(jù)情況控制事務(wù)提交或回滾。
            3、executeSql:這個方法用于執(zhí)行真實的SQL查詢。
            下面我們就以具體的示例進行演示。
          <!DOCTYPE html>
          <html>
          <head>
          <meta charset="utf-8">
          <title>Database API</title>
          </head>
          <body>
          <script type="text/javascript">
          //數(shù)據(jù)文件在谷歌瀏覽器下,默認(rèn)存放的位置
          //"C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Default/databases/1";
          if(window.openDatabase){
          //如果test數(shù)據(jù)庫存在,則打開,否則會自動創(chuàng)建
          var db  =  openDatabase("test", "1.0", "Database test", 1024 * 1024);
          //創(chuàng)建一個學(xué)生表
          var sql = 'CREATE TABLE  if not exists "student" ('+
          '"_id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'+
          '"name"  TEXT NOT NULL,'+
          '"age"  TEXT,'+
          '"mark"  TEXT)';
          //寫入一條數(shù)據(jù)
          var sql2 = 'insert into student (name,age,mark) values ("frog",1,"nice frog") ';
          //取出一行數(shù)據(jù)
          var sql3 = 'select * from student';
          //預(yù)處理語句的用法
          var sql4 = 'insert into student (name,age,mark) values (:name,:age,:mark)';
          /**
          * 預(yù)處理語句在php中也有類似的用法
          * $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
          * $stmt->bindParam(':name', $name);
          * $stmt->bindParam(':value', $value);
          */
          var name = 'aron';
          var age  = 29;
          var mark = 'hello world';
          exec(sql,function(rs){
          //這里之所以要用回調(diào),
          //是因為數(shù)據(jù)操作過程是異步的
          exec(sql2,function(rs){
          exec(sql3,function(rs){
          console.log(rs.rows.item(0))
          })
          exec2(sql4,[name,age,mark])
          })
          });
          //簡單封裝一個數(shù)據(jù)操作的方法
          function exec(sql,callback){
          db.transaction(function(tx){
          //中間這個[],在預(yù)處理語句中綁值
          tx.executeSql(sql,[],function(tx,rs){
          //success
          callback && callback(rs);
          },function(tx,msg){
          //error
          console.log(msg);
          });
          });
          }
          //支持變量邦定
          function exec2(sql,para,callback){
          para = para || [];
          db.transaction(function(tx){
          tx.executeSql(sql,para,function(tx,rs){
          //success
          callback && callback(rs);
          },function(tx,msg){
          //error
          console.log(msg);
          });
          });
          }
          }
          </script>
          </body>
          </html>
            以上代碼另存為html文件,在谷歌瀏覽器上,打開控制臺,可以看到運行的結(jié)果。
            局限性:
            可惜,我測試了下程序員最喜歡用的Firefox瀏覽器,可惜它并不支持這種本地數(shù)據(jù)庫SQLite,且有可能被indexDB所替代的趨勢。

          posted on 2014-07-10 19:40 順其自然EVO 閱讀(631) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 甘孜县| 皋兰县| 佛学| 前郭尔| 徐水县| 乃东县| 密山市| 贞丰县| 怀安县| 襄垣县| 田东县| 丹棱县| 吴川市| 四会市| 大冶市| 思南县| 方城县| 霍邱县| 恭城| 甘洛县| 寻乌县| 蓝山县| 利津县| 巴里| 叶城县| 德格县| 含山县| 翼城县| 咸丰县| 鄂托克旗| 夏河县| 如皋市| 榕江县| 靖边县| 临澧县| 东乡族自治县| 商丘市| 永平县| 奎屯市| 南郑县| 子长县|