我的家園

          我的家園

          HTML 5 Web SQL核心三叉戟

          Posted on 2012-04-15 16:37 zljpp 閱讀(128) 評(píng)論(0)  編輯  收藏

          Web SQL數(shù)據(jù)庫(kù)API實(shí)際上未包含在HTML 5規(guī)范之中,它是一個(gè)獨(dú)立的規(guī)范,它引入了一套使用SQL操作客戶端數(shù)據(jù)庫(kù)的API。假設(shè)你是一名優(yōu)秀的Web開發(fā)人員,那毫無(wú)疑問(wèn),你對(duì)SQL和數(shù)據(jù)庫(kù)的相關(guān)概念已經(jīng)很熟悉了,如果你對(duì)SQL不熟悉,那在繼續(xù)閱讀本文之前,最好先學(xué)習(xí)一下SQL相關(guān)的教程。

          最新版本的Chrome,Safari和Opera瀏覽器都支持Web SQL數(shù)據(jù)庫(kù)。

          核心方法

          本文將介紹規(guī)范中定義的三個(gè)核心方法:

          1、openDatabase:這個(gè)方法使用現(xiàn)有數(shù)據(jù)庫(kù)或創(chuàng)建新數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象。

          2、transaction:這個(gè)方法允許我們根據(jù)情況控制事務(wù)提交或回滾。

          3、executeSql:這個(gè)方法用于執(zhí)行真實(shí)的SQL查詢。

          打開數(shù)據(jù)庫(kù)

          openDatabase方法打開一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在,它還可以創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建并打開數(shù)據(jù)庫(kù)的語(yǔ)法如下:

          1. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 

          上面的openDatabase方法使用了下面五個(gè)參數(shù):

          1、數(shù)據(jù)庫(kù)名(mydb)

          2、版本號(hào)(1.0)

          3、描述(Test DB)

          4、數(shù)據(jù)庫(kù)大?。?*1024*1024)

          5、創(chuàng)建回調(diào)

          最后一個(gè),即第五個(gè)參數(shù)“創(chuàng)建回調(diào)”,在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)調(diào)用它,但即使沒(méi)有這個(gè)參數(shù),一樣可以在運(yùn)行時(shí)創(chuàng)建數(shù)據(jù)庫(kù)。

          執(zhí)行查詢

          執(zhí)行查詢使用database.transaction()函數(shù),它只需要一個(gè)參數(shù),下面是一個(gè)真實(shí)的查詢語(yǔ)句:

          1. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
          2. db.transaction(function (tx) {    
          3.    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');  
          4. }); 

          上面的查詢將會(huì)在“mydb”數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)LOGS表。

          插入操作

          為了向表中插入新記錄,我們?cè)谏厦娴牟樵冋Z(yǔ)句中添加了一個(gè)簡(jiǎn)單的SQL查詢,修改后的語(yǔ)句如下:

          1. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
          2. db.transaction(function (tx) {  
          3.    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');  
          4.    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');  
          5.    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');  
          6. }); 

          在插入新記錄時(shí),我們還可以傳遞動(dòng)態(tài)值,如:

          1. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
          2. db.transaction(function (tx) {    
          3.   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');  
          4.   tx.executeSql('INSERT INTO LOGS   
          5.                         (id,log) VALUES (?, ?'), [e_id, e_log];  
          6. }); 

          這里的e_id和e_log是外部變量,executeSql在數(shù)組參數(shù)中將每個(gè)項(xiàng)目映射到“?”。

          讀操作

          如果要讀取已經(jīng)存在的記錄,我們使用一個(gè)回調(diào)捕獲結(jié)果,代碼如下:

          1. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
          2. db.transaction(function (tx) {  
          3.    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');  
          4.    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');  
          5.    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');  
          6. });  
          7. db.transaction(function (tx) {  
          8.    tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {  
          9.    var len = results.rows.length, i;  
          10.    msg = "<p>Found rows: " + len + "</p>";  
          11.    document.querySelector('#status').innerHTML +=  msg;  
          12.    for (i = 0; i < len; i++){  
          13.       alert(results.rows.item(i).log );  
          14.    }  
          15.  }, null);  
          16. }); 

          完整的例子

          最后,我們?cè)谝粋€(gè)完整的HTML 5文檔中展現(xiàn)前面講述的內(nèi)容,同時(shí)使用瀏覽器來(lái)解析這個(gè)HTML 5文檔。

          1. <!DOCTYPE HTML> 
          2. <html> 
          3. <head> 
          4. <script type="text/javascript"> 
          5. var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
          6. var msg;  
          7. db.transaction(function (tx) {  
          8.   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');  
          9.   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');  
          10.   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');  
          11.   msg = '<p>Log message created and row inserted.</p>';  
          12.   document.querySelector('#status').innerHTML =  msg;  
          13. });  
          14.  
          15. db.transaction(function (tx) {  
          16.   tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {  
          17.    var len = results.rows.length, i;  
          18.    msg = "<p>Found rows: " + len + "</p>";  
          19.    document.querySelector('#status').innerHTML +=  msg;  
          20.    for (i = 0; i < len; i++){  
          21.      msg = "<p><b>" + results.rows.item(i).log + "</b></p>";  
          22.      document.querySelector('#status').innerHTML +=  msg;  
          23.    }  
          24.  }, null);  
          25. });  
          26. </script> 
          27. </head> 
          28. <body> 
          29. <div id="status" name="status">Status Message</div> 
          30. </body> 
          31. </html> 

          下面是在最新版本的Safari或Opera瀏覽器中產(chǎn)生的輸出結(jié)果。

          1. Log message created and row inserted.  
          2.  
          3. Found rows: 2  
          4.  
          5. foobar  
          6.  
          7. logmsg 

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 博爱县| 兰坪| 水富县| 巢湖市| 安远县| 南宫市| 班戈县| 高邮市| 分宜县| 黄陵县| 延边| 泗阳县| 平陆县| 海林市| 门源| 柘城县| 新乡县| 沙洋县| 成都市| 昭苏县| 凤冈县| 宁陕县| 张家川| 阳东县| 罗山县| 昔阳县| 泽普县| 聊城市| 集贤县| 常宁市| 乐平市| 志丹县| 阜阳市| 德昌县| 肇东市| 平度市| 泸州市| 定安县| 华池县| 巴楚县| 延川县|