HTML5 Web SQL 數(shù)據(jù)庫(kù)
Web SQL 是在瀏覽器上模擬數(shù)據(jù)庫(kù),可以使用 JS 來(lái)操作 SQL 完成對(duì)數(shù)據(jù)的讀寫。
Web SQL 數(shù)據(jù)庫(kù) API 并不是 HTML5 規(guī)范的一部分,但是它是一個(gè)獨(dú)立的規(guī)范,引入了一組使用 SQL 操作客戶端數(shù)據(jù)庫(kù)的 APIs。
如果你是一個(gè) Web 后端程序員,應(yīng)該很容易理解 SQL 的操作。
你也可以參考我們的 SQL 教程,了解更多數(shù)據(jù)庫(kù)操作知識(shí)。
Web SQL 數(shù)據(jù)庫(kù)可以在最新版的 Safari, Chrome 和 Opera 瀏覽器中工作。
核心方法
以下是規(guī)范中定義的三個(gè)核心方法:
- openDatabase:這個(gè)方法使用現(xiàn)有的數(shù)據(jù)庫(kù)或者新建的數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)對(duì)象。
- transaction:這個(gè)方法讓我們能夠控制一個(gè)事務(wù),以及基于這種情況執(zhí)行提交或者回滾。
- executeSql:這個(gè)方法用于執(zhí)行實(shí)際的 SQL 查詢。
打開(kāi)數(shù)據(jù)庫(kù)
我們可以使用 openDatabase() 方法來(lái)打開(kāi)已存在的數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在,則會(huì)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),使用代碼如下:
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
openDatabase() 方法對(duì)應(yīng)的五個(gè)參數(shù)說(shuō)明:
- 數(shù)據(jù)庫(kù)名稱
- 版本號(hào)
- 描述文本
- 數(shù)據(jù)庫(kù)大小
- 創(chuàng)建回調(diào)
第五個(gè)參數(shù),創(chuàng)建回調(diào)會(huì)在創(chuàng)建數(shù)據(jù)庫(kù)后被調(diào)用。
執(zhí)行查詢操作
執(zhí)行操作使用 database.transaction() 函數(shù):
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)'); });
上面的語(yǔ)句執(zhí)行后會(huì)在 'mydb' 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為 LOGS 的表。
插入數(shù)據(jù)
在執(zhí)行上面的創(chuàng)建表語(yǔ)句后,我們可以插入一些數(shù)據(jù):
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, "W3Cschool教程")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "m.hgci.cn")'); });
我們也可以使用動(dòng)態(tài)值來(lái)插入數(shù)據(jù):
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]); });
實(shí)例中的 e_id 和 e_log 是外部變量,executeSql 會(huì)映射數(shù)組參數(shù)中的每個(gè)條目給 "?"。
讀取數(shù)據(jù)
以下實(shí)例演示了如何讀取數(shù)據(jù)庫(kù)中已經(jīng)存在的數(shù)據(jù):
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, "W3Cschool教程")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "m.hgci.cn")'); }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "查詢記錄條數(shù): " + len + "
"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ alert(results.rows.item(i).log ); } }, null); });
完整實(shí)例
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, "W3Cschool教程")');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "m.hgci.cn")');
msg = '<p>數(shù)據(jù)表已創(chuàng)建,且插入了兩條數(shù)據(jù)。</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>查詢記錄條數(shù): " + 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);
});
以上實(shí)例運(yùn)行結(jié)果如下圖所示:
刪除記錄
刪除記錄使用的格式如下:
db.transaction(function (tx) { tx.executeSql('DELETE FROM LOGS WHERE id=1'); });
刪除指定的數(shù)據(jù) id 也可以是動(dòng)態(tài)的:
db.transaction(function(tx) { tx.executeSql('DELETE FROM LOGS WHERE id=?', [id]); });
更新記錄
更新記錄使用的格式如下:
db.transaction(function (tx) { tx.executeSql('UPDATE LOGS SET log=\'m.hgci.cn\' WHERE id=2'); });
更新指定的數(shù)據(jù) id 也可以是動(dòng)態(tài)的:
db.transaction(function(tx) { tx.executeSql('UPDATE LOGS SET log=\'m.hgci.cn\' WHERE id=?', [id]); });
完整實(shí)例
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <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, "W3Cschool教程")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "m.hgci.cn")'); msg = '<p>數(shù)據(jù)表已創(chuàng)建,且插入了兩條數(shù)據(jù)。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('DELETE FROM LOGS WHERE id=1'); msg = '<p>刪除 id 為 1 的記錄。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('UPDATE LOGS SET log=\'m.hgci.cn\' WHERE id=2'); msg = '<p>更新 id 為 2 的記錄。</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>查詢記錄條數(shù): " + 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">狀態(tài)信息</div> </body> </html>
以上實(shí)例運(yùn)行結(jié)果如下圖所示:
更多建議: