頻道欄目
首頁 > 資訊 > HTML 5 > 正文

HTML5本地數據庫(SQLite)示例

12-05-09        來源:[db:作者]  
收藏   我要投稿

按照國內一HTML5先行者的例子仿寫了一個用HTML5 API來操作本地SQLite數據庫的例子,感覺這個功能蠻好玩的,但是還不夠強大,尤其瀏覽器支持力度不夠:
HTML代碼:
1. <!DOCTYPE html>
2. <head>
3. <meta charset="UTF-8">
4. <title>使用HTML5本地數據庫DEMO</title>
5. <script type="text/javascript" src="js/operateDB.js"></</script>
6. </head>
7. 
8. <body onload="init();">
9. <h1>使用HTML5本地數據庫DEMO</h1>
10. <table>
11.     <tr><td>姓名:</td><td><input type="text" id="name"></td></tr>
12.     <tr><td>資料:</td><td><input type="text" id="info"></td></tr>
13.     <tr>
14.         <td></td>
15.         <td><input type="button" value="保存" onclick="saveData();"></td>
16.     </tr>
17. </table>
18. <hr>
19. <table id="datatable" border="1"></table>
20. <p id="msg"></p>
21. </body>
javascript 封裝了許多方法,比如保存數據到數據庫,更新,同步下方的列表等。
1. /*
2.  * This file is confidential by Charles.Wang Copyright belongs to Charles.wang
3.  * You can make contact with Charles.Wang (charles_wang888@126.com)
4.  */
5.  
6.  //這個是下方的表格元素
7.  var datatable = null;
8.  
9.  //創建一個數據庫對象
10.  //4個參數分別是 數據庫名,版本號,數據庫的描述,數據庫大小
11.  var db = openDatabase('MyData','','My Database',102400);
12.  
13.  //init()方法,用于頁面下方表格元素的引用,并且顯示所有的數據庫記錄
14.  function init(){
15.     //取得下方的表格元素,并且賦值給全局變量
16.     datatable = document.getElementById("datatable");
17.     
18.     //顯示所有已經在數據庫中存儲的記錄
19.     showAllData();
20.  }
21.  
22.  //removeAllData()方法,用于移除所有的表格中的當前顯示數據(它并不去除數據庫記錄)
23.  function removeAllData(){
24.     //首先,它將<table>下面的所有子元素全部清除
25.     //所以,這里它對于datatable組件進行遍歷
26.     for(var i=datatable.childNodes.length-1;i>=0;i--){
27.         datatable.removeChild(datatable.childNodes(i));
28.     }
29.     
30.     //全部去除之后,現在需要顯示這個表頭部分<tr>里面有多個<th>
31.     //創建表頭行到文檔樹中
32.     var tr= document.createElement('tr');
33.     //表頭行的第一個表頭
34.     var th1=document.createElement('th');
35.     //表頭行的第二個表頭
36.     var th2=document.createElement('th');
37.     //表頭行的第三個表頭
38.     var th3=document.createElement('th');
39.     //設置這3個表頭的文本
40.     th1.innerHTML="姓名";
41.     th2.innerHTML="資料";
42.     th3.innerHTML="時間";
43.     //將這些表頭依次放在表頭行中
44.     tr.appendChild(th1);
45.     tr.appendChild(th2);
46.     tr.appendChild(th3);
47.     //將這個新創建的表頭行掛到表格中
48.     datatable.appendChild(tr);
49.  }
50.  
51.  //構建指定數據庫行的數據對應的HTML文本。傳入參數:數據庫結果集中的某一行記錄
52.  function showData(row){
53.      //構建一個表行用于取得當前所要的信息
54.      var tr= document.createElement('tr');
55.      //創建第一列,這一列是姓名
56.      var td1=document.createElement('td');
57.      //填充第一列的信息為該行的name
58.      td1.innerHTML=row.name;
59.      //創建第二列,這一列是留言
60.      var td2=document.createElement('td');
61.      //填充第一列的信息為該行的message
62.      td2.innerHTML=row.info;
63.     //創建第三列,這一列是日期
64.      var td3=document.createElement('td');
65.      //創建一個日期對象
66.      var t = new Date();
67.      t.setTime(row.time);
68.      //將日期的標準形式和國際化日期形式分別設置給當前列
69.      td3.innerHTML=t.toLocaleString()+" "+t.toLocaleTimeString();
70.      //吧這三列掛到當前行中
71.      tr.appendChild(td1);
72.      tr.appendChild(td2);
73.      tr.appendChild(td3);
74.      //讓這個表格在后面加上這一行
75.      datatable.appendChild(tr);
76.  }
77.  
78.  //這個函數用于顯示所有的行到表格中,這些行是從數據庫中拿出來的
79.  function showAllData(){
80.     //開啟SQLite數據庫事務,它用一個回調函數作為參數表明要執行的語句
81.     db.transaction(function(tx){
82.         //首先它創建一個數據庫表,里面有3個字段
83.         tx.executeSql('CREATE TABLE IF NOT EXISTS InfoData(name TEXT,info TEXT,time INTEGER)',[]);
84.         //創建一個查詢語句用來查詢數據庫表的所有記錄(這個由于是所有查詢,所以不需要預編譯語句和參數 (第二個參數))
85.         //然后定義了一個回調函數,表明對于結果集的處理
86.         tx.executeSql('SELECT * FROM InfoData',[],function(tx,rs){
87.             
88.             //對于結果集,首先,在獲取它之前移除頁面上的<table>的所有數據
89.             removeAllData();
90.             //遍歷結果集,對于每一行,依次調用showData來在table上創建對于的html文本
91.             for(var i=0;i<rs.rows.length;i++){
92.                 //對于item(i),也就是某一行記錄,我們顯示其內容到頁面的表格中(構建對應的HTML片斷)
93.                 showData(rs.rows.item(i));
94.             }
95.         });
96.     }
97.  
98.     );
99.  }
100.  
101.  //這個函數用于添加一條記錄到數據庫中,這些信息有些是從頁面獲得的,有些是系統生成的。
102.  function addData(name,info,time){
103.     //開啟一個數據庫事務
104.     //回調函數是一個有參數的插入語句,可以看到我們插入到表InfoData中,插入的內容也就是參數傳遞進來的內容
105.     db.transaction(function(tx){
106.         
107.         //插入的語句是個模板語句
108.         //插入成功的回調就是在控制臺上輸入一行日志
109.         tx.executeSql('INSERT INTO InfoData VALUES(?,?,?)' , [name,info,time],function(tx,rs){
110.             console.log("成功保存數據!");
111.         },
112.         //插入失敗的回調就是在控制臺上輸入一行錯誤日志
113.         function(tx,error){
114.             console.log(error.source+"::"+error.message);
115.         });
116.     }
117.     
118.     );
119.  }
120.  
121.  //保存用戶的當前輸入,這個是作為點擊頁面上”保存“按鈕的事件處理函數
122.  function saveData(){
123.     //從HTML頁面中取得2個輸入框的文本
124.     var name=document.getElementById('name').value;
125.     var info=document.getElementById('info').value;
126.     //得到當前的系統時間 www.kaosanakqu.com
127.     var time= new Date().getTime();
128.     //將用戶名,用戶信息,當前時間存到數據庫中
129.     addData(name,info,time);
130.     //更新下方<p id="msg">的表格顯示
131.     showAllData();
132.  }
 
我在Google Chrome上做了測試,以下是截圖:

  
Chrome我使用的版本是最新版的,假定我安裝到了C:\Documents and Settings\charles.wang\Local Settings\Application Data\Google\Chrome
那么SQLite數據庫就安裝到了$CHROME_HOME\User Data\Default\databases
這個目錄中databases.db是當前用戶的所有創建的數據庫的配置,而file__0目錄則是數據庫表文件目錄:

 
 
我們使用SQLite管理工具打開這2個文件,就可以很清楚的看到:
 
在Databases.db中配置了所用到的數據庫:

這和我們js中的設定一樣:
 

  1. //創建一個數據庫對象
  2.  //4個參數分別是 數據庫名,版本號,數據庫的描述,數據庫大小
  3.  var db = openDatabase('MyData','','My Database',102400); 
  4.   

 
而當我們打開數據庫文件,則可以看到:

這些數據庫中的記錄正是我們在頁面上所展示的。
 
 
局限性
可惜,我測試了下程序員最喜歡用的Firefox瀏覽器(版本號12),可惜它并不支持這種本地數據庫SQLite,如圖(我打開了Firebug的console):

希望以后這個問題可以得到改善,畢竟用Firefox的人還是很多的,尤其程序員。
 
 



摘自 平行線的凝聚
相關TAG標簽
上一篇:HTML5播放video或者audio
下一篇:SQLSERVER CLR無序自增(支持并發)性能對比
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片