`

w3c-html-javascript: webdatabase

阅读更多
首先看一下例子源码:

function prepareDatabase(ready, error) {
  return openDatabase('documents', '1.0', 'Offline document storage', 5*1024*1024, function (db) {
    db.changeVersion('', '1.0', function (t) {
      t.executeSql('CREATE TABLE docids (id, name)');
    }, error);
  });
}

function showDocCount(db, span) {
  db.readTransaction(function (t) {
    t.executeSql('SELECT COUNT(*) AS c FROM docids', [], function (t, r) {
      span.textContent = r.rows[0].c;
    }, function (t, e) {
      // couldn't read database
      span.textContent = '(unknown: ' + e.message + ')';
    });
  });
}

prepareDatabase(function(db) {
  // got database
  var span = document.getElementById('doc-count');
  showDocCount(db, span);
}, function (e) {
  // error getting database
  alert(e.message);
});


阅读记录

1、 对于openDatabase的一切API 都是一部的,如果想用同步的API,可以考虑使用openDatabaseSync
2、 当我们调用openDatabase方法的时候,会发生了什么,
            [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);
};

      参数解释: DOMString name数据库名称、DOMString version数据库版本 、DOMString displayName显示名称(这个参数的意思,举个例子,如果我通过浏览器参看webdatabase的状态,该参数将会提供更友好的文字描述),estimatedSize 容量大小(单位bytes)、creationCallback回调函数
      1)、如果浏览器禁用了webdatabase,此时会抛出异常
      2)、openDatabase属于window对象
      3)、如果提供了数据库版本,并且提供的数据库名称已经存在,但是数据库的版本与方法参数的版本信息不一致,则会抛出异常,此时会中断后续步骤的处理
      4)、如果提供的数据库名称没有被创建,怎么新创建一个数据库,成功之后会调用callback回调函数,此时我们可以设置数据的版本为空,否者次数的数据库版本号,与方法参数提供的一致,同理,如果数据库存在,则会创建失败
     5)、对于openDatabase()方法返回的数据库对象是最新构建的对象,并且数据库名称为参数名称。(openDatabaseSync同理)
     6)、如果openDatabse或openDatabseSync创建失败,即使提供了callback,那么callback 也是不会被执行的
            对于openDatabse方式,会将datbase结果传递个callback函数,并调用它
            对于openDatabseSync方式,如果callback方法抛出异常 则也会中断
      7)、返回database结果

  3、从opendatabase方法中可以看出,我们可以指定版本号,从而创建我们期望版本的数据库对象,如果版本号参数为空(即空字符串),则任意版本都可以
 
  4、有关sql方面
      1)、sql参数也支持?作为参数占位符
      2)、如果我们创建的database对象版本不存在,则所有的SQL操作都将是无效的,并且会抛出异常,举个例子,此版本号如果callback
      3)、sql语法不对、sql中存在不支持的特性函数、sql参数与?占位符不一致,则sql statement无效
      4)、如果sqltrasaction事务mode是read-only,如果执行修改操作,则sql statement无效


异步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);
};


  1、从上面的方法可以看出transaction() and readTransaction()都有三个参数,这三个参数都是Funtion, 第一个参数Fun是处理业务的,如果该方法报错,会执行第二个errorCallback,如果成功怎么执行第三个successCallback。

  2、从名字中可以看出readTransaction是只读的, transaction可以是read or write

  3、如果你蛋疼的话,你可以切换当前的数据库版本为参数指定的版本,切换过程是原子性的,ok,之后的处理就可以transaction()或readTransaction()一致了(如果你指定的版本不存在,会切换失败的,估计还是会当前的版本去异步执行后续的处理)
           切换过程主要干了两件事情:
         1、Change the database's actual version to the value of the second argument to the changeVersion() method.
         2、Change the Database object's expected version to the value of the second argument to the changeVersion() method.

执行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);
}
  


   对于executeSql方法的流程如下
   1)、打开一个新的sql transaction ,如果事务是read/write 则当前事务必须获取一个整个数据库的独占写锁,如果是只读的,则获取一个整个数据库范围的共享读锁,所以每一个请求都必须等待一个适当的锁,直至可用
   2)、如果在开始事务过程当中,发生错误,则会执行errorCallback,并且rollback事务,销毁事务对象
   3)、对于通过changeVersion()方式,如果切换目标版本发生错误时,则结局和(2)
   4)、如果callback发生异常,同(2)
   5)、每一个sql语句排入事务当中,都会发生以下事情,首先是检测sql语句是否正确(有可能失败),如果正确则会在事务的上下文中执行该语句(有可能失败),如果执行成功则会创建一个SqlResultSet对象去包装sql的返回结果,接下来会执行callback回调函数(有可能失败),并且将SqlResultSet对象传递给callback函数,接下来将重新执行下一条Sql语句,如果以上步骤发生错误的话((有可能失败)标记) 则会发生以下情况,执行errorCallback,如果errorCallback return false, 则会继续正常执行下一条sql语句,否则会终止所有业务执行

interface SQLResultSet {
  readonly attribute long insertId;
  readonly attribute long rowsAffected;
  readonly attribute SQLResultSetRowList rows;
};


interface SQLResultSetRowList {
  readonly attribute unsigned long length;
  getter any item(in unsigned long index);
};


记录:
   1、insertId 当执行sql 插入时insertId记录的是当前插入记录的ID, 如果插入多条的话,则是最后一条的ID
   2、rowsAffected, 对于更新操作是,此属性记录受影响的行数
   3、rows 对于select操作时,该记录是保存响应结果
   4、length代表记录的个数
   5、 item代表响应数据

   W3c中描述
   Note:  For the asynchronous API, implementors are encouraged to prefetch all the data for SQLResultSetRowList objects when the object is constructed (before the result set callback is invoked), rather than on-demand, for better responsiveness. For the synchronous API, an on-demand lazy evaluation implementation strategy is encouraged instead, for better performance.Fetching the length might be expensive, and authors are thus encouraged to avoid using it (or enumerating over the object, which implicitly uses it) where possible

 
  
分享到:
评论

相关推荐

    ejemplo-bd-websql:使用websql api的简单示例

    1. **WebSQL API:** WebSQL 是 W3C 提出的一种标准,但已被废弃,被 IndexedDB 所取代。尽管如此,在某些老旧的浏览器或者特定场景下,WebSQL 仍然被用来进行本地存储。它提供了一个 SQL 方言的接口,允许开发者...

    HTML5介绍

    DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt; ``` 此外,HTML5 引入了许多新的结构元素,使页面布局更为清晰,语义化更强。这些元素包括: - `&lt;article&gt;`: 表示文档...

    w3c标准html5手册

    HTML5是Web开发的最新标准,它在2014年由W3C(World Wide Web Consortium,万维网联盟)正式发布,旨在提升网页的互动性、可访问性和可用性。这个标准不仅更新了HTML语言,还引入了新的元素、APIs以及对多媒体的支持...

    JS操作数据库的实例代码

    DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;meta http-equiv="Content-Type" ...

    SAP BPC学习资料(强力推荐与传播)_新版SP03_Microsoft

    - **HTML, XML, XHTML, W3C:** These trademarks suggest web and internet-related functionalities. - **Java:** The Java trademark implies support for Java-based applications and services. - **JavaScript:...

    web-development:学习期间创建的Web开发代码

    - 文档和教程:MDN Web Docs、W3Schools、Stack Overflow等提供详尽的技术参考。 - 开源社区:GitHub上有许多示例项目和开源代码库可供学习。 通过不断练习和参与实际项目,开发者可以逐渐熟悉Web开发的各个方面...

    自己学习使用的w3c,需要的时候可以下载看看

    【标题】: "自己学习使用的w3c" 指的是W3C(World Wide Web Consortium)的标准文档或教程资源,这些资源通常包含了Web开发相关的技术规范和指南,包括HTML、CSS、JavaScript等核心技术。 【描述】: "需要的时候...

    HTML5应用开发技术-Web SQL数据库.pptx

    - 局限:由于维护问题,Web SQL已不再被W3C推荐作为标准,新的Web应用程序通常转向使用IndexedDB或Web Storage的组合。 4. **替代方案**: - **IndexedDB**:虽然学习曲线较陡,但其提供了更高级的查询能力和更大...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子...02.&lt;web-app xmlns:xsi=...

    Pro_HTML5_Programming_2nd_Edition

    - **W3C接管**:随着HTML标准的不断发展,世界万维网联盟(W3C)接手了HTML规范的管理工作。 - **停滞与复苏**:进入2000年后,HTML一度被认为是一个“死胡同”,焦点转向了XML和XHTML。然而,HTML并未因此消失,它...

    WebSql 学习实例

    - 它是W3C的一个草案,但目前已被弃用,推荐使用IndexedDB作为替代方案。尽管如此,某些老旧的浏览器(如旧版的Chrome和Safari)仍然支持WebSQL。 2. **基本操作** - **创建数据库**:通过`window.openDatabase()...

    前端开源库-anysql-websql

    2. **非标准**:Web SQL不是W3C的标准,这意味着其未来的发展和兼容性存在不确定性。 综上所述,anysql-websql为开发者提供了一种在前端使用Web SQL的途径,尤其适合处理旧项目或对性能有较高要求的应用。然而,...

    string

    DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;` - 这一行指定了文档类型为HTML 4.01 Transitional,这是一种宽松的标准,允许某些不符合标准的HTML元素...

    html5 Web SQL Database 之事务处理函数transaction与executeSQL解析

    需要注意的是,尽管Web SQL Database在早期被广泛使用,但它已经不再被W3C推荐作为标准,而是被IndexedDB所取代。IndexedDB提供了更复杂的对象存储和索引功能,且更适合现代Web应用程序的需求。然而,对于理解离线...

    揭秘HTML5和CSS3

    HTML5的发展历程可以追溯到2004年,由Web Hypertext Application Technology Working Group (WHATWG)推动,并得到了World Wide Web Consortium (W3C)的支持。HTML5在HTML4和XHTML的基础上进行了重大改进,不再强调...

    SAP ides BASIS R3 ECC 安装

    - **HTML**、**DHTML**、**XML** 和 **XHTML**:这些是 W3C(World Wide Web Consortium)的商标或注册商标。 - **Java**:Sun Microsystems 的注册商标。 - **JavaScript**:Sun Microsystems 的注册商标,由 ...

    前端开源库-websql

    - WebSQL 并未成为 W3C 的正式标准,因此其未来的发展和浏览器支持存在不确定性。 - 虽然在 Safari 和旧版 Chrome 中支持良好,但 Firefox、Edge 和新版 Chrome 已经逐步停止支持。 - 由于 WebSQL 的异步性质,确保...

    学习JavaEE的day44

    W3School提供了大量的Web开发教程和参考文档,包括HTML、CSS、JavaScript、SQL、PHP、Java等各种技术,是初学者和进阶者学习Web技术的重要资源。离线版则可以在没有网络的情况下查阅资料,对于学习者来说非常便利。 ...

Global site tag (gtag.js) - Google Analytics