HTML5本地數據庫(SQLite)示例


本文轉載自http://blog.sina.com.cn/s/blog_641cf27f01016pm5.html

按照國內一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. 
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.getElementByIdx_x("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_x('tr');
33.     //表頭行的第一個表頭
34.     var th1=document_createElement_x('th');
35.     //表頭行的第二個表頭
36.     var th2=document_createElement_x('th');
37.     //表頭行的第三個表頭
38.     var th3=document_createElement_x('th');
39.     //設置這3個表頭的文本
40.     th1.innerHTML="姓名";
41.     th2.innerHTML="資料";
42.     th3.innerHTML="時間";
43.     //將這些表頭依次放在表頭行中
44.     tr.a(th1);
45.     tr.a(th2);
46.     tr.a(th3);
47.     //將這個新創建的表頭行掛到表格中
48.     datatable.a(tr);
49.  }
50.  
51.  //構建指定數據庫行的數據對應的HTML文本。傳入參數:數據庫結果集中的某一行記錄
52.  function showData(row){
53.      //構建一個表行用於取得當前所要的信息
54.      var tr= document_createElement_x('tr');
55.      //創建第一列,這一列是姓名
56.      var td1=document_createElement_x('td');
57.      //填充第一列的信息為該行的name
58.      td1.innerHTML=row.name;
59.      //創建第二列,這一列是留言
60.      var td2=document_createElement_x('td');
61.      //填充第一列的信息為該行的message
62.      td2.innerHTML=row.info;
63.     //創建第三列,這一列是日期
64.      var td3=document_createElement_x('td');
65.      //創建一個日期對象
66.      var t = new Date();
67.      t.setTime(row.time);
68.      //將日期的標准形式和國際化日期形式分別設置給當前列
69.      td3.innerHTML=t.toLocaleString()+" "+t.toLocaleTimeString();
70.      //吧這三列掛到當前行中
71.      tr.a(td1);
72.      tr.a(td2);
73.      tr.a(td3);
74.      //讓這個表格在后面加上這一行
75.      datatable.a(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.getElementByIdx_x('name').value;
125.     var info=document.getElementByIdx_x('info').value;
126.     //得到當前的系統時間 www.2cto.com
127.     var time= new Date().getTime();
128.     //將用戶名,用戶信息,當前時間存到數據庫中
129.     addData(name,info,time);
130.     //更新下方<p id="msg">的表格顯示
131.     showAllData();
132.  }
 
我在Google Chrome上做了測試,以下是截圖:

  HTML5本地數據庫(SQLite)示例
Chrome我使用的版本是最新版的,假定我安裝到了C:\Documents and Settings\charles.wang\Local Settings\Application Data\Google\Chrome
那么SQLite數據庫就安裝到了$CHROME_HOME\User Data\Default\databases
這個目錄中databases.db是當前用戶的所有創建的數據庫的配置,而file__0目錄則是數據庫表文件目錄:
HTML5本地數據庫(SQLite)示例
 
 
我們使用SQLite管理工具打開這2個文件,就可以很清楚的看到:
 
在Databases.db中配置了所用到的數據庫:
HTML5本地數據庫(SQLite)示例
這和我們js中的設定一樣:
 

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

 
而當我們打開數據庫文件,則可以看到:
HTML5本地數據庫(SQLite)示例
這些數據庫中的記錄正是我們在頁面上所展示的。
 
 
局限性
可惜,我測試了下程序員最喜歡用的Firefox瀏覽器(版本號12),可惜它並不支持這種本地數據庫SQLite,如圖(我打開了Firebug的console):
HTML5本地數據庫(SQLite)示例 
希望以后這個問題可以得到改善,畢竟用Firefox的人還是很多的,尤其程序員。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM