一组支持PhoneGap的数据库工具类

我所做的一个项目中用到了 PhoneGap的数据库.在PhoneGap中遇到问题,是很纠结的.但是我发现一些简单的方法, 因此我写了一组支持工具类来支持我的项目. 我把它分享给大家.

 我的工具类库有如下特性s:
executeBatch:得到文件路径 (通过 URL), 你可以通过 PhoneGap 读取包括SQL设置命令的XML文件. 示例:
  1. myDbController.executeBatch("sql/createtables.xml",successHandler,errHandler);
复制代码

这里的XML如下:

  1. <sql>
  2. <statement>
  3. create table foo if not exists foo(....)
  4. </statement>
  5. <statement>
  6. create table moo if not exists foo(....)
  7. </statement>
  8. </sql>
复制代码


和 Adobe AIR的机制不一样,  SQLite在PhoneGap中 不允许你预填充数据库. (虽然有折中的方法: Prepopulate SQLite DataBase in PhoneGap Application.) 这是通过修改 Christope Coenraets得到的语法。 
executeSql: 真如你所预料的,这只是结束执行的SQL. PhoneGap没有使这点很困难 , 我发现 API 所有的回调都要使用. ("All"  例如:
  1. dbController.executeSql("select * from notes", gotNote, errHandler);
复制代码

 

另一个好处是这里会自动获取结果然后返回简单的array对象. 其次, 大大简化了过程. 
最后, 这个类有一个简单的 init() handler. 它也可以自动调用您的批处理脚本。例如:
  1. dbController.init("main","data/seed.xml",dbReady);
复制代码

代码如下:

  1. var DBController = function() {
  2.     var db,success,failure;
  3.     
  4.     return {
  5.         init:function(name,importscript,successHandler)    {
  6.             //todo - allow for version
  7.             db = window.openDatabase(name,"1.0",name,100000);            
  8.             if(typeof importscript !== "undefined") {
  9.                 console.log("being asked to run a script");
  10.                 if(typeof successHandler === "undefined") throw "Invalid call - must pass success handler when importing data";
  11.                 this.executeBatch(importscript,successHandler);
  12.             }
  13.         },
  14.         executeBatch:function(path,successHandler,errorHandler) {
  15.             success=successHandler;
  16.             failure=errorHandler;
  17.             
  18.             $.get(path, {}, this.gotFile, "xml");
  19.         },
  20.         //sql, successHandler, errorHandler are required
  21.         executeSql:function(sql,args,successHandler,errorHandler) {
  22.             console.log('going to run '+sql+ ' '+arguments.length);
  23.             //Don't like this - but way to make args be optional and in 2nd place
  24.             if(arguments.length == 3) {
  25.                 successHandler = arguments[1];
  26.                 errorHandler = arguments[2];
  27.                 args = [];
  28.             }
  29.             db.transaction(
  30.                 function(tx) { tx.executeSql(sql,args,function(tx,res) {
  31.                     //todo - figure out fraking scoping rules and why line below didnt work, nor this.X
  32.                     //res = translateResultSet(res);
  33.                     var result = [];
  34.                     for(var i=0; i<res.rows.length; i++) {
  35.                         result.push(res.rows.item(i));
  36.                     }
  37.                     successHandler(result);
  38.                 })}
  39.             , errorHandler)    
  40.         },
  41.         
  42.             
  43.         gotFile:function(doc) {
  44.             var statements = [];
  45.             var statementNodes=doc.getElementsByTagName("statement");
  46.             for(var i=0; i<statementNodes.length; i++) {
  47.                 statements.push(statementNodes[i].textContent);
  48.             }
  49.             if(statements.length) {
  50.                 db.transaction(function(tx) {
  51.                     //do nothing
  52.                     for(var i=0;i<statements.length;i++) {
  53.                         tx.executeSql(statements[i]);
  54.                     }
  55.                 }, failure,success);
  56.             }
  57.         },
  58.         
  59.         translateResultSet:function(res) {
  60.             var result = [];
  61.             for(var i=0; i<res.rows.length; i++) {
  62.                 result.push(res.rows.item(i));
  63.             }
  64.             return result;
  65.             
  66.         }
  67.             
  68.     }
  69.     
  70. };
复制代码
posted @ 2014-03-20 11:51  huidaoli  阅读(167)  评论(0编辑  收藏  举报