zoukankan      html  css  js  c++  java
  • HTML5的Web SQL Database

    本文将介绍 Web SQL Database 规范中定义的三个核心方法:

    1. openDatabase:这个方法使用现有数据库或新建数据库来创建数据库对象
    2. transaction:这个方法允许我们根据情况控制事务提交或回滚
    3. executeSql:这个方法用于执行真实的 SQL 查询

    Database

    [Supplemental, NoInterfaceObject] 
    interface WindowDatabase { 
        Database openDatabase(in DOMString name,                   // 数据库名称
                              in DOMString version,                // 数据库版本。每个数据库一时间只能有一个版本号,不能一时间拥有多个版本号,版本号用来保护数据库不被写入脏数据。
                              in DOMString displayName,            // 显示名
                              in unsigned long estimatedSize,      // 数据库大小
                              in optional DatabaseCallback creationCallback); // 创建失败的回调函数
    }; 
    Window implements WindowDatabase; 
    
    [Supplemental, NoInterfaceObject] 
    interface WorkerUtilsDatabase { 
        Database openDatabase(in DOMString name,                   
                              in DOMString version,                 
                              in DOMString displayName,
                              in unsigned long estimatedSize,
                              in optional DatabaseCallback creationCallback);
        DatabaseSync openDatabaseSync(in DOMString name,
                                      in DOMString version,
                                      in DOMString displayName,
                                      in unsigned long estimatedSize,
                                      in optional DatabaseCallback creationCallback);
    }; 
    
    WorkerUtils implements WorkerUtilsDatabase; 
    [Callback=FunctionOnly, NoInterfaceObject] 
    interface DatabaseCallback { 
        void handleEvent(in Database database);
    };

    每个域都有一组相关的数据库,每个数据库有名字和当前的版本号。这套 API 并不提供遍历或删除域中的某个数据库的功能。

    每个数据库一时间只能有一个版本号,不能一时间拥有多个版本号,版本号用来保护数据库不被写入脏数据。

     如果提供了回调函数,回调函数用以调用 changeVersion() 函数,不管给定什么样的版本号,回调函数将把数据库的版本号设置为空;如果没有提供回调函数,则以给定的版本号创建数据库。

    包括空字符串在内的所有字符串都可以作为有效地数据库名称,数据库名称区分大小写,且可以比较。

    异步数据库 API(Asynchronous Database API)

    interface Database { 
    // 异步打开数据库,可读可写
    void transaction(in SQLTransactionCallback callback, // 回调方法 in optional SQLTransactionErrorCallback errorCallback, // 失败方法 in optional SQLVoidCallback successCallback); // 成功方法
    // 异步打开数据库,只读
    void readTransaction(in SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback); readonly attribute DOMString version; // 返回数据库的当前版本号 void changeVersion(in DOMString oldVersion, in DOMString newVersion, in optional SQLTransactionCallback callback, in optional SQLTransactionErrorCallback errorCallback, in optional SQLVoidCallback successCallback); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLVoidCallback { void handleEvent(); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLTransactionCallback { void handleEvent(in SQLTransaction transaction); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLTransactionErrorCallback { void handleEvent(in SQLError error); };

    方法 transaction() 和 readTransaction() 有一个到三个参数,后两个参数为可选的,分别表示错误回调函数和成功回调函数。

    transaction() 方法为 read/write 模式,readTransaction() 方法为只读模式;

    获取属性 version 必须返回数据库的当前版本号;方法 changeVersion 允许脚本自动地检查版本号,并修改它。

    执行 SQL 语句

    typedef sequence<any> ObjectArray; 
    
    interface SQLTransaction { 
        void executeSql(in DOMString sqlStatement,                             // 表示查询的字符串
    in optional ObjectArray arguments, // 插入到查询语句中问号所在处的字符串数据 in optional SQLStatementCallback callback, // 一个可选的成功时执行函数 in optional SQLStatementErrorCallback errorCallback); // 一个可选的失败时执行函数 }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementCallback { void handleEvent(in SQLTransaction transaction,
    in SQLResultSet resultSet); }; [Callback=FunctionOnly, NoInterfaceObject] interface SQLStatementErrorCallback { boolean handleEvent(in SQLTransaction transaction,
    in SQLError error); };

    数据库查询结果(Database Query Result)

    interface SQLResultSet { 
        readonly attribute long insertId;             // 如果插入数据库一行数据,insertId 代表这个行号;如果插入多行数据,insertId 代表插入数据的最后一行行号。
        readonly attribute long rowsAffected;         // 改变的行数。如果 SQL 语句没有改变任何行,则 rowsAffected 为 0,对于“SELECT”语句,rowsAffected 就为 0。
        readonly attribute SQLResultSetRowList rows;  // 一个 SQLResultSetRowList 对象,代表数据库按顺序返回的行。如果没有返回任何行,则这个对象为空。
    };

    附上简单示例

    <!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>
  • 相关阅读:
    记录一次线上优化流程
    php ignite 使用问题记录
    invalid contrller specified 错误分析及解决
    koa 2 的 async 和 await 语法
    koa 2 的安装
    vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
    VS2019专业版和企业版激活密钥
    RE:ゼロから始める PKU 生活 episode 2
    CSP-S 2020 游记
    ioi2021集训队作业
  • 原文地址:https://www.cnblogs.com/sy4w/p/5936489.html
Copyright © 2011-2022 走看看