首先看一下例子源码:
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
分享到:
相关推荐
2007-02-17 06:44 349,696 w3core.dll 2005-04-04 00:00 83,754 w3core.mfl 2005-04-04 00:00 74,002 w3core.mof 2007-02-17 06:44 39,424 w3dt.dll 2007-02-17 06:50 4,862 w3dt.mfl 2007-02-17 06:44 6,238 w3dt....
w3school.CHM_2009-12-24 23:46 平安夜更新 about ado ado ajax asp aspnet browsers careers ...w3c wap web webservices wmlscript wsdl xforms xhtml xlink xml xmldom xpath xquery xsl xslfo
w3c-dom.jar 包 dom解析xml使用 包 免积分下载
2005-4-4 0:00 w3core.mfl 82 KB MFL 文件 2005-4-4 0:00 w3core.mof 73 KB MOF 文件 2005-4-4 0:00 w3dt.dll 39 KB 应用程序扩展 2007-2-17 23:36 w3dt.mfl 5 KB MFL 文件 2005-4-4 0:00 w3dt.mof 7...
w3c-libwww-5.4.0.7z
W3Cs-Real-Time-Web.pdf
一个具有W3C-Css 样式风格的MessageBox Web控件源码采用C#实现,样式风格漂亮。
w3af---web应用安全工具
前端开发手册大全11个(CSS-javascript-jquery-w3c-XHTML-XML).zip CSS参考手册-Web前端开发参考手册系列 Web前端开发规范手册必备 CSS参考手册 javascript参考手册 CSS参考手册 jquery参考手册 XML参考手册 XHTML...
W3C网站重新设计-HTML原型 网址 开发: : 部署方式 我们使用进行部署。 部署会将相关分支克隆到路径中的本地计算机 /.deployer 然后,它运行所需的构建命令,然后将构建的站点部署到服务器 部署到开发 dep ...
w3af REST API w3af的REST API的Docker映像(nginx)受监管。 好处 大多数用户只能从使用./w3af_api ,但高级用户可能需要具有可以处理更多流量的环境,在服务关闭时自动重新启动服务等。 运行此图像 sudo docker ...
w3c-shcool.rar w3c-shcool.rar
词汇RDF::Vocab::ACL - (W3C) RDF::Vocab::Bibframe -(LoC) RDF::Vocab::CRM - RDF::Vocab::DataCite - RDF::Vocab::DWC -RDF::Vocab::EDM - RDF::Vocab::Fcrepo3 (module) - * RDF::Vocab::Fcrepo4 - RDF::Vocab::...
W3C-LinkChecker-4.5.tar.gz
W3CShcool、正则、C语言、C#、css学习工具chm帮助文档集合,对于初学者来说是很好的学习资源,经常做此类开发的朋友也可以下载看下,基础知识点不能扔的,欢迎大家下载学习
W3C可访问名称计算原型W3C替代文本计算的功能原型。 可访问名称计算原型 为了确保互操作性,所有浏览器都必须同样支持W3C替代文本计算。 AccName原型反映了W3C AccName规范的发展,随着W3C ARIA工作组内的不断发展...
W3Schools-SQL-数据库 与W3Schools无关。 访问他们的以获取有关WebProgramming的教程。 如果运行此则可以在右侧找到SQL教程中使用的W3Schools数据库中的所有表。 我无法在w3schools网站上找到位置/链接来下载数据库...
w3w-arcgis-webappbuilder-widget 自定义窗口小部件,通过提供反向地理编码。先决条件的已安装和配置的实例what3words API密钥; 您可以快速轻松地此小部件的副本安装与配置通过将w3wwidget文件夹及其内容复制到Web ...
node-w3capi — W3C APIJavaScript客户端该库为提供了一个客户端,该客户端公开了有关诸如规格,组,用户等之类的信息。它遵循一种简单的模式,在该模式中,将建立一个查询,然后使数据被提取。用法服务器端通常: ...
w3c-libwww-5.4.下载库