Web SQL數(shù)據(jù)庫(kù)API實(shí)際上未包含在HTML 5規(guī)范之中,它是一個(gè)獨(dú)立的規(guī)范,它引入了一套使用SQL操作客戶端數(shù)據(jù)庫(kù)的API。假設(shè)你是一名優(yōu)秀的Web開發(fā)人員,那毫無(wú)疑問(wèn),你對(duì)SQL和數(shù)據(jù)庫(kù)的相關(guān)概念已經(jīng)很熟悉了,如果你對(duì)SQL不熟悉,那在繼續(xù)閱讀本文之前,最好先學(xué)習(xí)一下SQL相關(guān)的教程。
最新版本的Chrome,Safari和Opera瀏覽器都支持Web SQL數(shù)據(jù)庫(kù)。
核心方法
本文將介紹規(guī)范中定義的三個(gè)核心方法:
1、openDatabase:這個(gè)方法使用現(xiàn)有數(shù)據(jù)庫(kù)或創(chuàng)建新數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象。
2、transaction:這個(gè)方法允許我們根據(jù)情況控制事務(wù)提交或回滾。
3、executeSql:這個(gè)方法用于執(zhí)行真實(shí)的SQL查詢。
打開數(shù)據(jù)庫(kù)
openDatabase方法打開一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在,它還可以創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建并打開數(shù)據(jù)庫(kù)的語(yǔ)法如下:
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
上面的openDatabase方法使用了下面五個(gè)參數(shù):
1、數(shù)據(jù)庫(kù)名(mydb)
2、版本號(hào)(1.0)
3、描述(Test DB)
4、數(shù)據(jù)庫(kù)大?。?*1024*1024)
5、創(chuàng)建回調(diào)
最后一個(gè),即第五個(gè)參數(shù)“創(chuàng)建回調(diào)”,在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)調(diào)用它,但即使沒(méi)有這個(gè)參數(shù),一樣可以在運(yùn)行時(shí)創(chuàng)建數(shù)據(jù)庫(kù)。
執(zhí)行查詢
執(zhí)行查詢使用database.transaction()函數(shù),它只需要一個(gè)參數(shù),下面是一個(gè)真實(shí)的查詢語(yǔ)句:
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
- db.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
- });
上面的查詢將會(huì)在“mydb”數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)LOGS表。
插入操作
為了向表中插入新記錄,我們?cè)谏厦娴牟樵冋Z(yǔ)句中添加了一個(gè)簡(jiǎn)單的SQL查詢,修改后的語(yǔ)句如下:
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
- db.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');
- });
在插入新記錄時(shí),我們還可以傳遞動(dòng)態(tài)值,如:
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
- db.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
- tx.executeSql('INSERT INTO LOGS
- (id,log) VALUES (?, ?'), [e_id, e_log];
- });
這里的e_id和e_log是外部變量,executeSql在數(shù)組參數(shù)中將每個(gè)項(xiàng)目映射到“?”。
讀操作
如果要讀取已經(jīng)存在的記錄,我們使用一個(gè)回調(diào)捕獲結(jié)果,代碼如下:
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
- db.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');
- });
- db.transaction(function (tx) {
- tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
- var len = results.rows.length, i;
- msg = "<p>Found rows: " + len + "</p>";
- document.querySelector('#status').innerHTML += msg;
- for (i = 0; i < len; i++){
- alert(results.rows.item(i).log );
- }
- }, null);
- });
完整的例子
最后,我們?cè)谝粋€(gè)完整的HTML 5文檔中展現(xiàn)前面講述的內(nèi)容,同時(shí)使用瀏覽器來(lái)解析這個(gè)HTML 5文檔。
- <!DOCTYPE HTML>
- <html>
- <head>
- <script type="text/javascript">
- var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
- var msg;
- db.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');
- tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');
- msg = '<p>Log message created and row inserted.</p>';
- document.querySelector('#status').innerHTML = msg;
- });
- db.transaction(function (tx) {
- tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
- var len = results.rows.length, i;
- msg = "<p>Found rows: " + len + "</p>";
- document.querySelector('#status').innerHTML += msg;
- for (i = 0; i < len; i++){
- msg = "<p><b>" + results.rows.item(i).log + "</b></p>";
- document.querySelector('#status').innerHTML += msg;
- }
- }, null);
- });
- </script>
- </head>
- <body>
- <div id="status" name="status">Status Message</div>
- </body>
- </html>
下面是在最新版本的Safari或Opera瀏覽器中產(chǎn)生的輸出結(jié)果。
- Log message created and row inserted.
- Found rows: 2
- foobar
- logmsg