HTML5 進(jìn)階系列:webSQL數(shù)據(jù)庫

HTML5 Web SQL 數(shù)據(jù)庫

Web SQL 數(shù)據(jù)庫 API 并不是 HTML5 規(guī)范的一部分濒募。但是它是一個(gè)獨(dú)立的規(guī)范呻粹,因?yàn)榘踩阅艿葐栴}蜀细,官方現(xiàn)在也已經(jīng)放棄了維護(hù)再芋。但是辜伟,這并不影響你對他的使用,只要你的數(shù)據(jù)不涉及到安全性能問題脊另,你大可去使用它导狡。當(dāng)然,它是基于MYSQL的偎痛,你要在學(xué)習(xí)他之前旱捧,你先的有一點(diǎn)mysql的知識。

核心方法

以下是規(guī)范中定義的三個(gè)核心方法:

  • openDatabase:這個(gè)方法使用現(xiàn)有的數(shù)據(jù)庫或者新建的數(shù)據(jù)庫創(chuàng)建一個(gè)數(shù)據(jù)庫對象踩麦。
  • transaction:這個(gè)方法讓我們能夠控制一個(gè)事務(wù)枚赡,以及基于這種情況執(zhí)行提交或者回滾。
  • executeSql:這個(gè)方法用于執(zhí)行實(shí)際的 SQL 查詢谓谦。

打開數(shù)據(jù)庫

我們可以使用 openDatabase() 方法來打開已存在的數(shù)據(jù)庫贫橙,如果數(shù)據(jù)庫不存在,則會(huì)創(chuàng)建一個(gè)新的數(shù)據(jù)庫反粥,使用代碼如下:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024,callback); 

openDatabase() 方法對應(yīng)的五個(gè)參數(shù)說明:

  • 數(shù)據(jù)庫名稱
  • 版本號
  • 描述文本
  • 數(shù)據(jù)庫大小(單位是 b)
  • 創(chuàng)建回調(diào)(非必須)
    第五個(gè)參數(shù)卢肃,創(chuàng)建回調(diào)會(huì)在創(chuàng)建數(shù)據(jù)庫后被調(diào)用。

transaction

transaction方法用以處理事務(wù)才顿,當(dāng)一條語句執(zhí)行失敗的時(shí)候莫湘,整個(gè)事務(wù)回滾。方法有三個(gè)參數(shù)

  • 包含事務(wù)內(nèi)容的一個(gè)方法
  • 執(zhí)行成功回調(diào)函數(shù)(可選)
  • 執(zhí)行失敗回調(diào)函數(shù)(可選)

executeSql

executeSql方法用以執(zhí)行SQL語句郑气,返回結(jié)果逊脯,方法有四個(gè)參數(shù)

  • SQL語句
  • 用以替換查詢字符串中問號的參數(shù)
  • 執(zhí)行成功回調(diào)函數(shù)(可選)
  • 執(zhí)行失敗回調(diào)函數(shù)(可選)
db.transaction(function(tx) {
    tx.executeSql("SELECT * FROM User WHERE id = ?", [id],
    (tx, res) => {
          console.log("sql成功")
    }, (tx, res) => {
          console.log("sql失敗")
        });
    }, (tx, res) => {
            console.log("事務(wù)成功")
        },(tx, res) => {
            console.log("事務(wù)成功")
        }
)

完整實(shí)例

這個(gè)例子有完整的,增竣贪、刪军洼、查操作


20180423_114749 (1).gif
20180423_123205.gif
20180423_123343.gif
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .login_wrap {
                margin: 20px auto 0;
                width: 300px;
                height: 280px;
                background: aqua;
                text-align: center;
            }
            
            .login_username, .login_password {
                height: 60px;
                display: flex;
                align-items: center;
            }
            
            input {
                height: 30px;
            }
            
            .login_button {
                width: 300px;
                height: 36px;
                line-height: 36px;
                background: red;
                cursor: pointer;
                margin-top: 20px;
            }
            
            #content {
                width: 400px;
                margin: 0 auto;
                background: aquamarine;
            }
            
            .rowClass {
                line-height: 36px;
                border: 1px solid #00FFFF;
                display: flex;
                justify-content: space-between;
            }
            
            .deleteClass {
                padding: 5px;
                background: cadetblue;
                cursor: pointer;
            }
        </style>
    </head>

    <body>
        <div class="login_wrap">
            <div class="login_username">
                <label htmlFor="">用戶名</label>
                <input id="username" name="username" />
            </div>
            <div class="login_password">
                <label htmlFor="">密碼</label>
                <input id="password" name="password" />
            </div>
            <div id="login_button" class="login_button">提交</div>

            <div id="deleteBtn" class="login_button">刪除數(shù)據(jù)庫</div>
        </div>

        <div id="content"></div>

        <script type="text/javascript">
            window.onload = function() {

                let login_button = document.getElementById("login_button");
                let deleteBtn = document.getElementById("deleteBtn");
                let content = document.getElementById("content");
                var db = openDatabase('UDB', '1.0', 'Test DB', 2 * 1024 * 1024);

                renderAllDB(db);

                db.transaction(function(tx) {
                    tx.executeSql('CREATE TABLE IF NOT EXISTS User(id INTEGER PRIMARY KEY AUTOINCREMENT,u_name VARCHAR(20),u_pwd VARCHAR(10))');
                });

                //添加數(shù)據(jù)
                login_button.onclick = function() {
                    let username = document.getElementById("username").value;
                    let passwords = document.getElementById("password").value;

                    if(username && passwords) {
                        add(db,username, passwords);
                    }
                }

                //刪除全部數(shù)據(jù)
                deleteBtn.onclick = function() {
                    deleteAllFn(db);
                }

                let dataLists = content.querySelectorAll("deleteClass");

                //刪除單條數(shù)據(jù)
                content.addEventListener("click",function(e){
                    var target = e.target;
                    var className = target.getAttribute("class");
                    if(className === "deleteClass"){
                        let id = target.getAttribute("data-id");
                        deleteFn(db,id);
                    }
                })
            }

            //刪除單條數(shù)據(jù)
            function deleteFn(db,id) {
                db.transaction(function(tx) {
                    tx.executeSql('DELETE FROM User WHERE id in (?)', [id], (tx, res) => {}, (tx, res) => {});
                }, (tx, res) => {}, (tx, res) => {
                    renderAllDB(db);
                });
            }

            //刪除全部數(shù)據(jù)
            function deleteAllFn(db) {
                db.transaction(function(tx) {
                    tx.executeSql('DELETE FROM User', [], (tx, res) => {
                        console.log("deletesssss", tx, res)
                    }, () => {
                        console.log("deletesssss1111111111111111")
                    });
                }, (tx) => {
                    console.log("22222222222222", tx)
                }, (tx) => {
                    renderAllDB(db);
                });
            }

            //添加數(shù)據(jù)
            function add(db, username, passwords) {
                db.transaction(function(tx) {
                    tx.executeSql('INSERT INTO User (u_name, u_pwd) VALUES (?,?)', [username, passwords],
                        function(tx, results) {
                            renderDB(db, results.insertId, username, passwords)
                        },
                        function(tx, res) {
                            console.log(tx, res.message)
                        })
                }, (tx) => {
                    console.log("22222222222222", tx)
                }, (tx) => {
                    console.log("1111111111111111")
                });
            }

            //讀取數(shù)據(jù)
            function renderAllDB(db) {
                db.transaction(function(tx) {
                    tx.executeSql("SELECT * FROM User", [],
                        (tx, res) => {
                            let str = "";
                            let data = res.rows;

                            for(item of data) {
                                str += `<p class="rowClass">姓名:${item.u_name}</span>密碼:<span>${item.u_pwd}</span><span class="deleteClass" data-id= "${item.id}">刪除</span></p>`
                            }

                            content.innerHTML = str;

                        }, (tx, res) => {
                            console.log("9999", res)
                        });
                });
            }

            //讀取數(shù)據(jù)
            function renderDB(db, id, username, passwords) {
                db.transaction(function(tx) {
                    tx.executeSql("SELECT * FROM User WHERE id = ?", [id],
                        (tx, res) => {
                            content.innerHTML += `<p class="rowClass">姓名:${username}</span>密碼:<span>${passwords}</span><span data-id= "${id}" class="deleteClass">刪除</span></p>`
                        }, (tx, res) => {});
                });
            }
        </script>
    </body>

</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市演怎,隨后出現(xiàn)的幾起案子匕争,更是在濱河造成了極大的恐慌,老刑警劉巖爷耀,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘桑,死亡現(xiàn)場離奇詭異,居然都是意外死亡歹叮,警方通過查閱死者的電腦和手機(jī)跑杭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咆耿,“玉大人德谅,你說我怎么就攤上這事∪荩” “怎么了窄做?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵愧驱,是天一觀的道長。 經(jīng)常有香客問我椭盏,道長组砚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任掏颊,我火速辦了婚禮糟红,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乌叶。我一直安慰自己盆偿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布枉昏。 她就那樣靜靜地躺著陈肛,像睡著了一般揍鸟。 火紅的嫁衣襯著肌膚如雪兄裂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天阳藻,我揣著相機(jī)與錄音晰奖,去河邊找鬼。 笑死腥泥,一個(gè)胖子當(dāng)著我的面吹牛匾南,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛔外,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蛆楞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夹厌?” 一聲冷哼從身側(cè)響起豹爹,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矛纹,沒想到半個(gè)月后臂聋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡或南,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年孩等,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采够。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肄方,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬癌,到底是詐尸還是另有隱情扒秸,我是刑警寧澤播演,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伴奥,受9級特大地震影響写烤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拾徙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一洲炊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尼啡,春花似錦暂衡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至书聚,卻和暖如春唧领,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雌续。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工斩个, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驯杜。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓受啥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸽心。 傳聞我的和親對象是個(gè)殘疾皇子滚局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容