pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML 5離線存儲之Web SQL

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

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

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

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

1,打開數據庫

2,創建表

3,新增數據

4,更新數據

5,讀取數據

6,刪除數據

事實上,關鍵點在于如何拿到一個可執行SQL語句的上下文,

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

executeReader,executeScalar兩個方法與executeNonQuery嚴重同質,

下邊的代碼產生定義了我們的dataBaseOperator"類",第二行

3-5行則定義打開數據庫連接方法,"類方法",效果類似C#中的靜態方法,直接類名.方法調用

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

整個 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",再看業務處理層(Business Logic Layer)

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

  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又是嚴重同質,不說了,僅SQL語句不同而已

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

  1. var _userStoryProvider = new userStoryProvider(); 

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

  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這個數組后,就沒有下文了,是自動創建HTML還是綁定到EXT,發揮想象力吧...繼續

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.  }; 

最后貼出應用的代碼,業務相關的代碼,不看也罷,誰家與誰家的都不同

  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.      /* 創建用戶故事表 */   
  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.  }   

看完代碼復習下基本功課

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接口,關注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.  };
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了有關HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實現柱狀圖的示例,本文使用canvas來實現一個圖表,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產品線較多,涵蓋了音視頻編輯、圖像處理、平面設計、影視后期等領域。這篇文章主要介紹了Adobe Html5 Extension開發初體驗圖文教程,非常不錯,需要的朋
這篇文章主要介紹了基于HTML5的WebGL經典3D虛擬機房漫游動畫,需要的朋友可以參考下
這篇文章主要介紹了html5實現移動端適配完美寫法,需要的朋友可以參考下
本篇文章主要介紹了HTML5響應式(自適應)網頁設計的實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 办公室装修_上海办公室设计装修_时尚办公新主张-后街印象 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 全自动包装机_灌装机生产厂家-迈驰包装设备有限公司 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 粘度计,数显粘度计,指针旋转粘度计 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | ZHZ8耐压测试仪-上海胜绪电气有限公司 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First| 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 高尔夫球杆_高尔夫果岭_高尔夫用品-深圳市新高品体育用品有限公司 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 |