本文轉載自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上做了測試,以下是截圖:
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中的設定一樣:
- //創建一個數據庫對象
- //4個參數分別是 數據庫名,版本號,數據庫的描述,數據庫大小
- var db = openDatabase('MyData','','My Database',102400);
而當我們打開數據庫文件,則可以看到:
這些數據庫中的記錄正是我們在頁面上所展示的。
局限性:
可惜,我測試了下程序員最喜歡用的Firefox瀏覽器(版本號12),可惜它並不支持這種本地數據庫SQLite,如圖(我打開了Firebug的console):
希望以后這個問題可以得到改善,畢竟用Firefox的人還是很多的,尤其程序員。