一组支持PhoneGap的数据库工具类
我所做的一个项目中用到了 PhoneGap的数据库.在PhoneGap中遇到问题,是很纠结的.但是我发现一些简单的方法, 因此我写了一组支持工具类来支持我的项目. 我把它分享给大家.
我的工具类库有如下特性s:
executeBatch:得到文件路径 (通过 URL), 你可以通过 PhoneGap 读取包括SQL设置命令的XML文件. 示例:
- myDbController.executeBatch("sql/createtables.xml",successHandler,errHandler);
这里的XML如下:
- <sql>
- <statement>
- create table foo if not exists foo(....)
- </statement>
- <statement>
- create table moo if not exists foo(....)
- </statement>
- </sql>
和 Adobe AIR的机制不一样, SQLite在PhoneGap中 不允许你预填充数据库. (虽然有折中的方法: Prepopulate SQLite DataBase in PhoneGap Application.) 这是通过修改 Christope Coenraets得到的语法。
executeSql: 真如你所预料的,这只是结束执行的SQL. PhoneGap没有使这点很困难 , 我发现 API 所有的回调都要使用. ("All" 例如:
- dbController.executeSql("select * from notes", gotNote, errHandler);
另一个好处是这里会自动获取结果然后返回简单的array对象. 其次, 大大简化了过程.
最后, 这个类有一个简单的 init() handler. 它也可以自动调用您的批处理脚本。例如:
- dbController.init("main","data/seed.xml",dbReady);
代码如下:
- var DBController = function() {
- var db,success,failure;
- return {
- init:function(name,importscript,successHandler) {
- //todo - allow for version
- db = window.openDatabase(name,"1.0",name,100000);
- if(typeof importscript !== "undefined") {
- console.log("being asked to run a script");
- if(typeof successHandler === "undefined") throw "Invalid call - must pass success handler when importing data";
- this.executeBatch(importscript,successHandler);
- }
- },
- executeBatch:function(path,successHandler,errorHandler) {
- success=successHandler;
- failure=errorHandler;
- $.get(path, {}, this.gotFile, "xml");
- },
- //sql, successHandler, errorHandler are required
- executeSql:function(sql,args,successHandler,errorHandler) {
- console.log('going to run '+sql+ ' '+arguments.length);
- //Don't like this - but way to make args be optional and in 2nd place
- if(arguments.length == 3) {
- successHandler = arguments[1];
- errorHandler = arguments[2];
- args = [];
- }
- db.transaction(
- function(tx) { tx.executeSql(sql,args,function(tx,res) {
- //todo - figure out fraking scoping rules and why line below didnt work, nor this.X
- //res = translateResultSet(res);
- var result = [];
- for(var i=0; i<res.rows.length; i++) {
- result.push(res.rows.item(i));
- }
- successHandler(result);
- })}
- , errorHandler)
- },
- gotFile:function(doc) {
- var statements = [];
- var statementNodes=doc.getElementsByTagName("statement");
- for(var i=0; i<statementNodes.length; i++) {
- statements.push(statementNodes[i].textContent);
- }
- if(statements.length) {
- db.transaction(function(tx) {
- //do nothing
- for(var i=0;i<statements.length;i++) {
- tx.executeSql(statements[i]);
- }
- }, failure,success);
- }
- },
- translateResultSet:function(res) {
- var result = [];
- for(var i=0; i<res.rows.length; i++) {
- result.push(res.rows.item(i));
- }
- return result;
- }
- }
- };
huidaoli版权所有:转载请注明出处,谢谢合作!