Web SQL 數(shù)據(jù)庫 API 并不是 HTML5 規(guī)范的一部分,但是它是一個獨立的規(guī)范,引入了一組使用 SQL 操作客戶端數(shù)據(jù)庫的 APIs。
假定你是一個優(yōu)秀的 Web 開發(fā)人員,如果是這樣的話,毫無疑問你會很清楚 SQL 和 RDBMS 的概念。如果你仍然需要一個 SQL 的議題,可以學(xué)習(xí)我們的 SQL 教程。
我們可以在最新版的 Safari,Chrome 和 Opera 中使用 Web SQL 數(shù)據(jù)庫。
下面是規(guī)范中定義的三個核心方法。也會涵蓋在本教程中:
如果數(shù)據(jù)庫已經(jīng)存在,openDatabase 方法負責(zé)開啟數(shù)據(jù)庫,如果不存在,這個方法會創(chuàng)建它。
使用下面的代碼可以創(chuàng)建并開啟一個數(shù)據(jù)庫:
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
上面的方法接受下列五個參數(shù):
最后也是第五個參數(shù),創(chuàng)建回調(diào)會在創(chuàng)建數(shù)據(jù)庫后被調(diào)用。然而,即使沒有這個特性(功能),運行時仍然會創(chuàng)建數(shù)據(jù)庫以及正確的版本。
執(zhí)行查詢需要使用 database.transaction() 函數(shù)。這個函數(shù)需要一個參數(shù),它是一個負責(zé)實際執(zhí)行查詢的函數(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)');
});
上面的查詢語句會在 'mydb' 數(shù)據(jù)庫中創(chuàng)建一個叫做的 LOGS 的表。
為了在表中創(chuàng)建條目,我們在上面的例子中加入簡單的 SQL 查詢,如下所示:
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")');
});
創(chuà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ù)中的每個條目給 "?"。
要讀取已經(jīng)存在的記錄,我們可以使用回調(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);
});
最后,然我們把這個例子放到如下所示的完整 HTML5 文檔中,然后嘗試在 Safari 瀏覽器中運行它:
<!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 瀏覽器中這會生成如下所示結(jié)果:
Log message created and row inserted.
Found rows: 2
foobar
logmsg
便于學(xué)習(xí)這一概念 - 請使用最新版的 Safari 或者 Opera 進行在線練習(xí)。