HTML5本地存儲——Web SQL Database

HTML5 WebStorage介紹了html5本地存儲的Local Storage和Session Storage,這兩個是以鍵值對存儲的解決方案,存儲少量數據結構很有用,但是對於大量結構化數據就無能爲力了,靈活大不夠強大。

Web SQL Database

我們經常在數據庫中處理大量結構化數據,html5引入Web SQL Database概念,它使用 SQL 來操縱客戶端數據庫的 API,這些 API 是異步的,規範中使用的方言是SQLlite,悲劇正是產生於此,Web SQL Database規範頁面有着這樣的聲明

image

This document was on the W3C Recommendation track but specification work has stopped. The specification reached an impasse: all interested implementors have used the same SQL backend (Sqlite), but we need multiple independent implementations to proceed along a standardisation path.

 大概意思就是

這個文檔曾經在W3C推薦規範上,但規範工作已經停止了。目前已經陷入了一個僵局:目前的所有實現都是基於同一個SQL後端(SQLite),但是我們需要更多的獨立實現來完成標準化。

也就是說這是一個廢棄的標準了,雖然部分瀏覽器已經實現,但。。。。。。。

三個核心方法

但是我們學一下也沒什麼壞處,而且能和現在W3C力推的IndexedDB做比較,看看爲什麼要廢棄這種方案。Web SQL Database 規範中定義的三個核心方法:

  1. openDatabase:這個方法使用現有數據庫或新建數據庫來創建數據庫對象
  2. transaction:這個方法允許我們根據情況控制事務提交或回滾
  3. executeSql:這個方法用於執行SQL 查詢

 

openDatabase

我們可以使用這樣簡單的一條語句,創建或打開一個本地的數據庫對象

var db = openDatabase('testDB', '1.0', 'Test DB', 2 * 1024 * 1024);

openDatabase接收五個參數:

  1. 數據庫名字
  2. 數據庫版本號
  3. 顯示名字
  4. 數據庫保存數據的大小(以字節爲單位 )
  5. 回調函數(非必須)

 

如果提供了回調函數,回調函數用以調用 changeVersion() 函數,不管給定什麼樣的版本號,回調函數將把數據庫的版本號設置爲空。如果沒有提供回調函數,則以給定的版本號創建數據庫。

transaction

transaction方法用以處理事務,當一條語句執行失敗的時候,整個事務回滾。方法有三個參數

  1. 包含事務內容的一個方法
  2. 執行成功回調函數(可選)
  3. 執行失敗回調函數(可選)

 

複製代碼
db.transaction(function (context) {
           context.executeSql('CREATE TABLE IF NOT EXISTS testTable (id unique, name)');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (0, "Byron")');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (1, "Casper")');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (2, "Frank")');
         });
複製代碼

這個例子中我們創建了一個table,並在表中插入三條數據,四條執行語句任何一條出現錯誤,整個事務都會回滾

executeSql

executeSql方法用以執行SQL語句,返回結果,方法有四個參數

  1. 查詢字符串
  2. 用以替換查詢字符串中問號的參數
  3. 執行成功回調函數(可選)
  4. 執行失敗回調函數(可選)

在上面的例子中我們使用了插入語句,看個查詢的例子

複製代碼
db.transaction(function (context) {
           context.executeSql('SELECT * FROM testTable', [], function (context, results) {
            var len = results.rows.length, i;
            console.log('Got '+len+' rows.');
               for (i = 0; i < len; i++){
              console.log('id: '+results.rows.item(i).id);
              console.log('name: '+results.rows.item(i).name);
            }
         });
複製代碼

完整示例

複製代碼
<!DOCTYPE HTML>
<html>
<head>
    <title>Web SQL Database</title>
</head>
<body>
    <script type="text/javascript">
        var db = openDatabase('testDB', '1.0', 'Test DB', 2 * 1024 * 1024);
        var msg;
        db.transaction(function (context) {
           context.executeSql('CREATE TABLE IF NOT EXISTS testTable (id unique, name)');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (0, "Byron")');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (1, "Casper")');
           context.executeSql('INSERT INTO testTable (id, name) VALUES (2, "Frank")');
         });

        db.transaction(function (context) {
           context.executeSql('SELECT * FROM testTable', [], function (context, results) {
            var len = results.rows.length, i;
            console.log('Got '+len+' rows.');
               for (i = 0; i < len; i++){
              console.log('id: '+results.rows.item(i).id);
              console.log('name: '+results.rows.item(i).name);
            }
         });
        });
    </script>
</body>
</html>
複製代碼

最後

由於Web SQL Database規範已經被廢棄,原因說的很清楚,當前的SQL規範採用SQLite的SQL方言,而作爲一個標準,這是不可接受的,每個瀏覽器都有自己的實現這還搞毛的標準。這樣瀏覽器兼容性就不重要了,估計慢慢會被遺忘。不過Chrome的控制檯真心好用啊,神馬cookie、Local Storage、Session Storage、Web SQL、IndexedDB、Application Cache等html5新增內容看的一清二楚,免去了很多調試代碼工作。

image

======================================================================

轉載地址:http://www.cnblogs.com/dolphinX/p/3405335.html

發佈了45 篇原創文章 · 獲贊 36 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章