久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

HTML 5離線存儲之Web SQL

WebDatabase 規(guī)范中說這份規(guī)范不再維護了,原因是同質(zhì)化(幾乎實現(xiàn)者都選擇了Sqlite), 且不說這些,單看在HTML5中如何實現(xiàn)離線數(shù)據(jù)的CRUD,最基本的用法(入門級別) …… ...

本篇沒有考慮異步,多線程及SQL注入

WebDatabase 規(guī)范中說這份規(guī)范不再維護了,原因是同質(zhì)化(幾乎實現(xiàn)者都選擇了Sqlite),

且不說這些,單看在HTML5中如何實現(xiàn)離線數(shù)據(jù)的CRUD,最基本的用法(入門級別)

1,打開數(shù)據(jù)庫

2,創(chuàng)建表

3,新增數(shù)據(jù)

4,更新數(shù)據(jù)

5,讀取數(shù)據(jù)

6,刪除數(shù)據(jù)

事實上,關(guān)鍵點在于如何拿到一個可執(zhí)行SQL語句的上下文,

像創(chuàng)建表,刪除表,CRUD操作等僅區(qū)別于SQL語句的寫法.OK,貌似"SqlHelper"啊,換個名字,dataBaseOperator就它了

executeReader,executeScalar兩個方法與executeNonQuery嚴重同質(zhì),

下邊的代碼產(chǎn)生定義了我們的dataBaseOperator"類",第二行

3-5行則定義打開數(shù)據(jù)庫連接方法,"類方法",效果類似C#中的靜態(tài)方法,直接類名.方法調(diào)用

6-15行則定義executeNonQuery方法,意指查詢數(shù)據(jù)庫,與executeReader方法和executeScalar方法同質(zhì),均可返回記錄集

整個 dataBaseOperator就完整了,很簡單,唯一要指出的是,測試以下代碼時請選擇一個支持HTML5的瀏覽器!如Google Chrome

  1. //TODO;SQL注入   
  2.   function dataBaseOperator() {};   
  3.  dataBaseOperator.openDatabase = function () {   
  4.      return window.openDatabase("dataBaseUserStories", "1.0", "dataBase used for user stories", 2 * 1024 * 1024);   
  5.  }   
  6.  dataBaseOperator.executeNonQuery = function (sql, parameters, callback) {   
  7.      var db = this.openDatabase();   
  8.      db.transaction(function (trans) {   
  9.          trans.executeSql(sql, parameters, function (trans, result) {  
  10.              callback(result);  
  11.          }, function (trans, error) {  
  12.              throw error.message;  
  13.          });  
  14.      });  
  15.  }  
  16.  dataBaseOperatordataBaseOperator.executeReader = dataBaseOperator.executeNonQuery;  
  17.  dataBaseOperatordataBaseOperator.executeScalar = dataBaseOperator.executeNonQuery; 

有了"SqlHeper",再看業(yè)務(wù)處理層(Business Logic Layer)

業(yè)務(wù)處理類包括了創(chuàng)建表,刪除表,新增記錄,刪除記錄以及讀取記錄,這里沒有寫更新,實際上先刪后增一樣滴,即使要寫也不復(fù)雜

  1. function userStoryProvider() {   
  2.      this.createUserStoryTable = function () {   
  3.          dataBaseOperator.executeNonQuery("CREATE TABLE tbUserStories(id integer primary key autoincrement,role,ability,benefit,name,importance,estimate,notes)");   
  4.      };   
  5.      this.dropUserStoryTable = function () {   
  6.          dataBaseOperator.executeNonQuery("DROP TABLE tbUserStories");   
  7.      };   
  8.      this.addUserStory = function (role, ability, benefit, name, importance, estimate, notes) {   
  9.          dataBaseOperator.executeNonQuery("INSERT INTO tbUserStories(role,ability,benefit,name,importance,estimate,notes) SELECT ?,?,?,?,?,?,?",  
  10.               [role, ability, benefit, name, importance, estimate, notes], function (result) {  
  11.                   //alert("rowsAffected:" + result.rowsAffected);  
  12.                });  
  13.      };  
  14.      this.removeUserStory = function (id) {  
  15.          dataBaseOperator.executeNonQuery("DELETE FROM tbUserStories WHERE id = ?", [id], function (result) {  
  16.              //alert("rowsAffected:" + result.rowsAffected);  
  17.           });  
  18.      };  
  19.      this.loadUserStories = function (callback) {  
  20.          dataBaseOperator.executeReader("SELECT * FROM tbUserStories", [], function (result) {  
  21.              callback(result);  
  22.          });  
  23.          //result.insertId,result.rowsAffected,result.rows24      };  
  24.  } 

createUserStoryTable,dropUserStoryTable,addUserStory,removeUserStory又是嚴重同質(zhì),不說了,僅SQL語句不同而已

但loadUserStories與上述四個方法均不同,是因為它把SQLResultSetRowList返回給了調(diào)用者,這里仍然是簡單的"轉(zhuǎn)發(fā)",頁面在使用的時候需要首先創(chuàng)建provider實例(使用類似C#中的類實例上的方法調(diào)用)

  1. var _userStoryProvider = new userStoryProvider(); 

之后就可以調(diào)用該實例的方法了,僅舉個例子,具體代碼省去

  1. function loadUserStory() {      
  2. try {          
  3. _userStoryProvider.loadUserStories(function (result) {             
  4.  var _userStories = new Array();              
  5. for (var i = 0; i < result.rows.length; i++) {                 
  6.  var o = result.rows.item(i);                
  7.  var _userStory = new userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes);                 
  8.  _userStories.push(_userStory);           
  9.    }//...      
  10. } catch (error) {       
  11.    alert("_userStoryProvider.loadUserStories:" + error);      
  12. }} 

得到_userStories這個數(shù)組后,就沒有下文了,是自動創(chuàng)建HTML還是綁定到EXT,發(fā)揮想象力吧...繼續(xù)

userStory是一個自定義的"Model" "類"·

  1. function userStory(id, name, role, ability, benefit, importance, estimate, notes) {   
  2.      this.id = id;   
  3.      this.name = name;   
  4.      this.role = role;   
  5.      this.ability = ability;   
  6.      this.benefit = benefit;   
  7.      this.importance = importance;   
  8.      this.estimate = estimate;   
  9.      this.notes = notes;  
  10.  }; 

最后貼出應(yīng)用的代碼,業(yè)務(wù)相關(guān)的代碼,不看也罷,誰家與誰家的都不同

  1. /*    
  2.      http://stackoverflow.com/questions/2010892/storing-objects-in-html5-localstorage    
  3.      http://www.w3.org/TR/webdatabase/#sqlresultset    
  4.      http://html5doctor.com/introducing-web-sql-databases/    
  5.      http://stackoverflow.com/questions/844885/sqlite-insert-into-with-unique-names-getting-id    
  6.   */    
  7.  var _userStoryProvider = new userStoryProvider();    
  8.  $(document).ready(function () {    
  9.      loadUserStory();   
  10.     
  11.      /* 添加用戶故事 */   
  12.      $("#btnAdd").click(function () {   
  13.          var item = { role: $("#role").val(), ability: $("#ability").val(), benefit: $("#benefit").val(), name: $("#Name").val(), importance: $("#Importance").val(), estimate: $("#Estimate").val(), notes: $("#Notes").val() };   
  14.          try {   
  15.              _userStoryProvider.addUserStory(item.role, item.ability, item.benefit, item.name, item.importance, item.estimate, item.notes);   
  16.              loadUserStory();   
  17.          } catch (error) {   
  18.              alert("_userStoryProvider.addUserStory:" + error);   
  19.          }   
  20.      });   
  21.     
  22.      /* 創(chuàng)建用戶故事表 */   
  23.      $("#btnCreateTable").click(function () {          try {   
  24.              _userStoryProvider.createUserStoryTable();   
  25.          } catch (error) {   
  26.              alert("_userStoryProvider.createUserStoryTable:" + error);   
  27.          }   
  28.      });   
  29.     
  30.      /* 刪除用戶故事表 */   
  31.      $("#btnDropTable").click(function () {   
  32.          try {   
  33.              _userStoryProvider.dropUserStoryTable();   
  34.          } catch (error) {   
  35.              alert("_userStoryProvider.dropUserStoryTable:" + error);   
  36.          }   
  37.      });   
  38.  });   
  39.     
  40.  /* 加載用戶故事 */   
  41.  function loadUserStory() {   
  42.      try {   
  43.          _userStoryProvider.loadUserStories(function (result) {   
  44.              var _userStories = new Array();   
  45.              for (var i = 0; i < result.rows.length; i++) {   
  46.                  var o = result.rows.item(i);   
  47.                  var _userStory = new userStory(o.id, o.name, o.role, o.ability, o.benefit, o.importance, o.estimate, o.notes);   
  48.                  _userStories.push(_userStory);   
  49.              }   
  50.     
  51.              if (!_userStories) return;   
  52.              var table = document.getElementById("user_story_table");   
  53.              if (!table) return;   
  54.              var _trs = table.getElementsByTagName("tr");   
  55.              var _len = _trs.length;   
  56.              for (var i = 0; i < _len; i++) {   
  57.                  table.removeChild(_trs[i]);   
  58.              }   
  59.              {   
  60.                  var tr = document.createElement("tr");   
  61.                  tr.setAttribute("class", "product_backlog_row header");   
  62.                  {   
  63.                      tr.appendChild(CreateTd("id", "id"));   
  64.                      tr.appendChild(CreateTd("name", "name"));   
  65.                      tr.appendChild(CreateTd("importance", "importance"));   
  66.                      tr.appendChild(CreateTd("estimate", "estimate"));   
  67.                      tr.appendChild(CreateTd("description", "role"));   
  68.                      tr.appendChild(CreateTd("notes", "notes"));   
  69.                      tr.appendChild(CreateTd("delete", "delete"));   
  70.                  };   
  71.                  table.appendChild(tr);   
  72.              }   
  73.              for (var i = 0; i < _userStories.length; i++) {   
  74.                  CreateRow(table, _userStories[i]);   
  75.              }   
  76.          });   
  77.      } catch (error) {   
  78.          alert("_userStoryProvider.loadUserStories:" + error);   
  79.      }   
  80.  }   
  81.  function CreateRow(table, userStory) {   
  82.      if (!table) return;  
  83.      if (!userStory) return;   
  84.      {   
  85.          var tr = document.createElement("tr");   
  86.          tr.setAttribute("class", "product_backlog_row");   
  87.          {   
  88.              tr.appendChild(CreateTd("id", userStory.id));   
  89.              tr.appendChild(CreateTd("name", userStory.name));   
  90.              tr.appendChild(CreateTd("importance", userStory.importance));   
  91.              tr.appendChild(CreateTd("estimate", userStory.estimate));   
  92.              tr.appendChild(CreateTd("description", userStory.role));   
  93.              tr.appendChild(CreateTd("notes", userStory.notes));   
  94.              tr.appendChild(CreateDeleteButton("delete_button", userStory.id));   
  95.          };   
  96.          table.appendChild(tr);   
  97.      }   
  98.  }  
  99.  function CreateTd(name, value) {  
  100.      var td = document.createElement("td");  
  101.      td.setAttribute("class", "user_story " + name);  
  102.      td.innerText = value;  
  103.      return td;  
  104.  };  
  105.  function CreateDeleteButton(name, id) {  
  106.      var td = document.createElement("td");  
  107.      td.setAttribute("class", "user_story " + name);  
  108.      /* 刪除用戶故事 */  
  109.      td.innerHTML = "<a href=\"###\" title=\"delete\" onclick=\"javascript:_userStoryProvider.removeUserStory(\'" + id + "');removeRow(this);\">>>delete</a>";  
  110.      return td;  
  111.  }  
  112.  function removeRow(obj) {  
  113.      document.getElementById("user_story_table").deleteRow(obj.parentNode.parentNode.rowIndex);  
  114.      //obj.parentNode.parentNode.removeNode(true);  
  115.  }   

看完代碼復(fù)習(xí)下基本功課

1,WindowDatabase接口,注意openDatabase方法

  1. [Supplemental, NoInterfaceObject]  
  2. interface WindowDatabase {   
  3.  Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);};  
  4. Window implements WindowDatabase;  
  5. [Supplemental, NoInterfaceObject]  
  6. interface WorkerUtilsDatabase {   
  7.  Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);  DatabaseSync openDatabaseSync(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in optional DatabaseCallback creationCallback);};  
  8. WorkerUtils implements WorkerUtilsDatabase;  
  9. [Callback=FunctionOnly, NoInterfaceObject]  
  10. interface DatabaseCallback {    
  11. void handleEvent(in Database database);  
  12. }; 

2,SQLTransaction接口,關(guān)注executeSql方法

  1. typedef sequence<any> ObjectArray;  
  2. interface SQLTransaction {   
  3.  void executeSql(in DOMString sqlStatement, in optional ObjectArray arguments, in optional SQLStatementCallback callback, in optional SQLStatementErrorCallback errorCallback);};  
  4. [Callback=FunctionOnly, NoInterfaceObject]  
  5. interface SQLStatementCallback {  
  6.   void handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet);};  
  7. [Callback=FunctionOnly, NoInterfaceObject]  
  8. interface SQLStatementErrorCallback {   
  9.  boolean handleEvent(in SQLTransaction transaction, in SQLError error);  
  10. }; 

3,最后看下SQLResultSetRowList定義

  1. interface SQLResultSetRowList {  
  2.   readonly attribute unsigned long length;    
  3. getter any item(in unsigned long index);  
  4. }; 

和SQLResultSet定義

  1. interface SQLResultSet {  
  2.    readonly attribute long insertId;  
  3.    readonly attribute long rowsAffected;  
  4.    readonly attribute SQLResultSetRowList rows;  
  5.  };
【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了有關(guān)HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實現(xiàn)柱狀圖的示例,本文使用canvas來實現(xiàn)一個圖表,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產(chǎn)品線較多,涵蓋了音視頻編輯、圖像處理、平面設(shè)計、影視后期等領(lǐng)域。這篇文章主要介紹了Adobe Html5 Extension開發(fā)初體驗圖文教程,非常不錯,需要的朋
這篇文章主要介紹了基于HTML5的WebGL經(jīng)典3D虛擬機房漫游動畫,需要的朋友可以參考下
這篇文章主要介紹了html5實現(xiàn)移動端適配完美寫法,需要的朋友可以參考下
本篇文章主要介紹了HTML5響應(yīng)式(自適應(yīng))網(wǎng)頁設(shè)計的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 精品国产视频 | www.jiujiu| 蜜桃一区二区 | 一区二区三区国产 | 国产高清久久 | 婷婷在线视频 | 日韩一级淫片 | 日韩一级免费 | 国产浮力第一页 | 黄av在线 | 黄视频免费在线观看 | 一级黄色a| 国产精品久久久久久久久久久久久久久 | 成人在线a| 色播久久 | 亚洲国产精品成人无久久精品 | 在线伊人网 | 99国产精品99久久久久久 | 成人做爰免费视频免费看 | 欧美日韩一区在线观看 | 亚洲欧美精品在线 | 日产精品久久久一区二区 | 日韩视频精品 | 亚洲成人av在线播放 | 亚洲精品18在线观看 | 日韩欧美在线视频观看 | 黑人操亚洲人 | 午夜免费视频 | 色天使在线视频 | 欧美性精品 | 欧美综合久久 | 国产欧美一区二区精品性色超碰 | 欧美日韩国产一区二区 | 亚洲一区二区三区在线 | 欧美精品综合 | 久久综合国产 | 久久国产影院 | 一区二区三区在线观看免费 | 欧美一级在线观看 | 9.1成人看片 | 色天使在线视频 |