`

另一个SQLite操作类(JavaScript)

 
阅读更多

sqlite.js

/**
A very simple Javascript layer for the web based SQLite database.

example usage:
var db = SQLite({ shortName: 'mydb' });
db.createTable('people', 'name TEXT, age INTEGER');
db.insert('people', { name: 'Jeremy', age: 29 });
db.update('people', { age: 30 }, { name: 'Jeremy' });
db.select('people', '*', { age: 30 }, function (results) { var x; for(x=0; x<results.rows.length; x++) { console.log(results.rows.item(x)); } });
db.destroy('people', { age: 30 });

Conditions can be:
  * a number: defaults to 'WHERE id=number'
  * a string: generates 'WHERE string'
  * an array: generates 'WHERE val1 AND val2'
  * a hash:   generates 'WHERE key=hash[key] AND key2=hash[key2]'

另外的例子:
  function pass(results, query) {
    var target = document.getElementById('results'), html = target.innerHTML;
    target.innerHTML = html + 'pass - ' + query + '<br />';
  }

  function fail(error, query) {
    var target = document.getElementById('results'), html = target.innerHTML;
    target.innerHTML = html + 'fail - ' + error.message + ': ' + query + '<br />';
  }

  var db = SQLite({ shortName: 'mydb' + parseInt(Math.random() * 100000), defaultErrorHandler: fail, defaultDataHandler: pass });

  db.createTable('people', 'name TEXT, age INTEGER');

  db.insert('people', { name: "Jeremy", age: 29 });
  db.insert('people', { name: "Tara", age: 28 });

  db.update('people', { age: 30 }, { name: 'Jeremy' });

  db.select('people', '*', { age: 30 }, null, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });
  db.select('people', 'name', null, { order: 'age DESC' }, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });
  db.select('people', 'name', null, { limit: 1 }, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });

  db.destroy('people', { age: 30 });

初始化参数:
  cfg.shortName:数据库名称,默认是 'mydatabase'
  cfg.version:数据库版本,默认是 '1.0'
  cfg.displayName:数据库显示名称,默认是 'My SQLite Database'
  cfg.maxSize:数据库最大占用空间,默认是 65536
  cfg.defaultErrorHandler = 出错处理函数,默认是 errorHandler
  cfg.defaultDataHandler = 数据处理函数,默认是 nullDataHandler (即不处理)
 * @param {} cfg
 */
function SQLite(cfg) {
  if (typeof window.openDatabase === 'undefined') {
    return;
  }

  function log(str) {
    if (typeof console !== 'undefined') {
      console.log(str);
    }
  }

  function isNumber(val) {
    switch (typeof val) {
    case 'number':
      return true;
    case 'string':
      return (/^\d+$/).test(val);
    case 'object':
      return false;
    }
  }

  /**
   * 默认数据处理函数
   * @param {} results
   */
  function nullDataHandler(results) { }

  /**
   * 默认出错处理函数
   * @param {} error
   */
  function errorHandler(error) {
    log('Oops. ' + error.message + ' (Code ' + error.code + ')');
  }

  var config = cfg || {}, db;
  
  config.shortName = config.shortName || 'mydatabase';
  config.version = config.version || '1.0';
  config.displayName = config.displayName || 'My SQLite Database';
  config.maxSize = 65536;
  config.defaultErrorHandler = config.defaultErrorHandler || errorHandler;
  config.defaultDataHandler = config.defaultDataHandler || nullDataHandler;

  //创建数据库
  try {
    db = openDatabase(config.shortName, config.version, config.displayName, config.maxSize);
  } catch (e) {
    if (e === 2) {
      log("Invalid database version.");
    } else {
      log("Unknown error " + e + ".");
    }

    return;
  }

  /**
   * 执行查询
   * @param {} query 查询语句
   * @param {} v 数据
   * @param {} d 数据处理回调函数
   * @param {} e 出错处理回调函数
   */
  function execute(query, v, d, e) {
    var values = v || [],
      dH = d || config.defaultDataHandler,
      eH = e || config.defaultErrorHandler;

    if (!query || query === '') {
      return;
    }

    function err(t, error) {
      eH(error, query);
    }

    function data(t, result) {
      dH(result, query);
    }

    db.transaction(
      function (transaction) {
        transaction.executeSql(query, values, data, err);
      }
    );
  }

  /**
   * 构造查询条件
   * @param {} conditions
   * @return {}
   */
  function buildConditions(conditions) {
    var results = [], values = [], x;

    if (typeof conditions === 'string') {
      results.push(conditions);
    } else if (typeof conditions === 'number') {
      results.push("id=?");
      values.push(conditions);
    } else if (typeof conditions === 'object') {
      for (x in conditions) {
        if (conditions.hasOwnProperty(x)) {
          if (isNumber(x)) {
            results.push(conditions[x]);
          } else {
            results.push(x + '=?');
            values.push(conditions[x]);
          }
        }
      }
    }

    if (results.length > 0) {
      results = " WHERE " + results.join(' AND ');
    } else {
      results = '';
    }

    return [results, values];
  }

  function createTableSQL(name, cols) {
    var query = "CREATE TABLE " + name + "(" + cols + ");";

    return [query, []];
  }

  function dropTableSQL(name) {
    var query = "DROP TABLE " + name + ";";

    return [query, []];
  }

  function insertSQL(table, map) {
    var query = "INSERT INTO " + table + " (#k#) VALUES(#v#);", keys = [], holders = [], values = [], x;

    for (x in map) {
      if (map.hasOwnProperty(x)) {
        keys.push(x);
        holders.push('?');
        values.push(map[x]);
      }
    }

    query = query.replace("#k#", keys.join(','));
    query = query.replace("#v#", holders.join(','));

    return [query, values];
  }

  function updateSQL(table, map, conditions) {
    var query = "UPDATE " + table + " SET #k##m#", keys = [], values = [], x;

    for (x in map) {
      if (map.hasOwnProperty(x)) {
        keys.push(x + '=?');
        values.push(map[x]);
      }
    }

    conditions = buildConditions(conditions);

    values = values.concat(conditions[1]);

    query = query.replace("#k#", keys.join(','));
    query = query.replace("#m#", conditions[0]);

    return [query, values];
  }

  function selectSQL(table, columns, conditions, options) {
    var query = 'SELECT #col# FROM ' + table + '#cond#', values = [];

    if (typeof columns === 'undefined') {
      columns = '*';
    } else if (typeof columns === 'object') {
      columns.join(',');
    }

    conditions = buildConditions(conditions);

    values = values.concat(conditions[1]);

    query = query.replace("#col#", columns);
    query = query.replace('#cond#', conditions[0]);

    if (options) {
      if (options.limit) {
        query = query + ' LIMIT ?';
        values.push(options.limit);
      }
      if (options.order) {
        query = query + ' ORDER BY ?';
        values.push(options.order);
      }
      if (options.offset) {
        query = query + ' OFFSET ?';
        values.push(options.offset);
      }
    }

    query = query + ';';

    return [query, values];
  }

  function destroySQL(table, conditions) {
    var query = 'DELETE FROM ' + table + '#c#;';

    conditions = buildConditions(conditions);

    query = query.replace('#c#', conditions[0]);

    return [query, conditions[1]];
  }

  return {
    database: db,
    createTable: function (name, cols, data, error) {
      var sql = createTableSQL(name, cols);
      execute(sql[0], sql[1], data, error);
    },
    dropTable: function (name, data, error) { 
      var sql = dropTableSQL(name);
      execute(sql[0], sql[1], data, error);
    },
    insert: function (table, map, data, error) {
      var sql = insertSQL(table, map);
      execute(sql[0], sql[1], data, error);
    },
    update: function (table, map, conditions, data, error) {
      var sql = updateSQL(table, map, conditions);
      execute(sql[0], sql[1], data, error);
    },
    select: function (table, columns, conditions, options, data, error) {
      var sql = selectSQL(table, columns, conditions, options);
      execute(sql[0], sql[1], data, error);
    },
    destroy: function (table, conditions, data, error) {
      var sql = destroySQL(table, conditions);
      execute(sql[0], sql[1], data, error);
    }
  };
}
 

用法:

 

<!DOCTYPE html>

<html lang="en-us">
<head>
  <title>Test Suite for sqlite.js</title>
  <script src="sqlite.js" type="text/javascript"></script>
</head>
<body>
<div id="results"></div>
<script type="text/javascript" charset="utf-8">

  function pass(results, query) {
    var target = document.getElementById('results'), html = target.innerHTML;
    target.innerHTML = html + 'pass - ' + query + '<br />';
  }

  function fail(error, query) {
    var target = document.getElementById('results'), html = target.innerHTML;
    target.innerHTML = html + 'fail - ' + error.message + ': ' + query + '<br />';
  }

  var db = SQLite({ shortName: 'mydb' + parseInt(Math.random() * 100000), defaultErrorHandler: fail, defaultDataHandler: pass });

  db.createTable('people', 'name TEXT, age INTEGER');

  db.insert('people', { name: "Jeremy", age: 29 });
  db.insert('people', { name: "Tara", age: 28 });

  db.update('people', { age: 30 }, { name: 'Jeremy' });

  db.select('people', '*', { age: 30 }, null, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });
  db.select('people', 'name', null, { order: 'age DESC' }, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });
  db.select('people', 'name', null, { limit: 1 }, function (r, q) { pass(r, q); var x; for(x=0; x<r.rows.length; x++) { console.log(r.rows.item(x)); } });

  db.destroy('people', { age: 30 });
</script>
</body>
</html>
分享到:
评论

相关推荐

    javascript封装的sqlite操作类实例

    主要介绍了javascript封装的sqlite操作类,可实现SQLite数据库的初始化及执行SQL语句的功能,具有一定参考借鉴价值,需要的朋友可以参考下

    Nodejs操作Sqlite3数据库封装

    介绍node-sqlite3 API,并对API初步封装,方便开发人员调用,实现业务逻辑。

    js+html5操作sqlite数据库的方法

    主要介绍了js+html5操作sqlite数据库的方法,以完整实例形式分析了JavaScript封装的html5操作SQLite数据库类,并分析了具体使用技巧,需要的朋友可以参考下

    C#(VB.net)数据库访问操作类库

    数据库操作类: 支持 SQLServer mysql sqlite Sybase Oracle等DB 数据库操作类 包括执行SQL或者存储过程,返回DataSet、DataTable等功能 完全支持存储过程和参数调用 javascriptClassLibrary 包括一些JavaScript 类...

    week10-database-sqlite:两个应用程序均使用sqlite数据库,一个应用程序使用动态创建的Views,另一个使用AdapterView来处理游标

    week10-database-sqlite sqlite数据库 使用sqlite数据库的示例代码,可对UI进行动态操作根据需要创建视图以处理游标数据集 ... 使用sqlite数据库的示例代码,UI使用AdapterView,因此sdk类用于创建和操作UI

    C#基类库(苏飞版)

    构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值); 17.执行存储过程,返回影响的行数; 18.创建 OracleCommand 对象实例(用来返回一个整数值) 复制代码 6.DbHelperSQLite类 [code=csharp] 1.数据访问...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    安卓上用于加载的Webview视图窗口只是作为类浏览器而存在,在安卓上更是只能同时运行一个Webview。(2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备...

    开发助手是一款面向开发人员的辅助工具,它集数据库管理,代码生成,数据库文档生成,代码收藏夹,富文本编辑,插件管理等功能模块

    开发助手是一款面向开发人员的辅助工具,它集数据库管理(目前支持sqlserver,sqlite,mysql,postgresql),代码生成(支持从数据库生成实体映射类,数据库操作DAL中间层),数据库文档生成,代码收藏夹(支持C#,SQL,...

    php网络开发完全手册

    5.2 创建一个简单类 71 5.3 PHP5与PHP4的差异 72 5.4 定义属性和方法 72 5.4.1 属性与方法的定义 72 5.4.2 传统的构造函数 73 5.4.3 PHP类中的一些特殊方法 74 5.5 类的引用、扩展与继承 75 5.5.1 类的引用 75 5.5.2...

    Android数据库hibernate框架.

    现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务. * (三)作者寄语: * 昔日有JavaScript借Java发展,今日也希望AHibernate借Hibernate之名发展. * 希望这个项目...

    Android程序设计基础

    当我向别人说起Android时,他们的第一个疑问通常是:我们为什么还需要另一个移动标准?它有何惊人之处?  虽然Android的一些特性并非首创,但它是第一个将以下特性结合在一起的环境。  基于Linux,真正开放、...

    weixin基于微信小程序的购物系统+php(源码+php小程序+vue).zip

    前端:Vue.js,一个渐进式JavaScript框架,用于构建用户界面。易于上手,灵活且高效,可以与其他库或现有项目一起使用。 数据库:可能使用的是MySQL或SQLite等,用于存储商品信息、用户数据等。 服务器:可能使用了...

    nativescript-toolbox:NativeScript模块,由有用的工具和助手组成

    一个轻量级JavaScript日期库,用于解析,验证,操作和格式化日期。 只需调用基于HTTP的API。 实施批处理操作。 创建和操作位图图像。 在您的NativeScript应用中使用的电子邮件插件。 您可以使用它来撰写电子邮件,...

    asp.net知识库

    一个.net发送HTTP数据实体的类 按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现...

    php课程(共100多节)

    58:快速设计一个企业网站之BIWEB 59:关于BIWEB常见问题和结构分析 60:PHP与数据库代码开发规范 61:PHP+Mysql新闻系统的开发一 62:PHP+Mysql新闻系统的开发二 63:PHP+Mysql新闻系统的开发三 64:PHP+Mysql新闻...

    编程狂人第九期(2014-1-20)

    中国自主研发cos操作系统 前端开发 Javascript和CSS浏览器兼容总结 盘点2013:最优秀的HTML5&CSS3设计 浏览器中关于事件的那点事儿 了解Json 和XML 常用CSS优化总结——网络性能与语法性能建议 编程语言 2013流行...

    android开发揭秘PDF

    2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建HelloAndroid项目 2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 调试HelloAndroid 2.4 小结 第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 ...

    一款基于JScript的ASP开源MVC框架

    有了这款基于JavaScript的ASP开源MVC框架,你的asp老项目有可以焕发青春活力了!其实不伦是asp,php,java还是python,任何一种编程语言,只要是开源的,就可以不断更新,获得延续的生命力。 单文件入口。Single entry...

Global site tag (gtag.js) - Google Analytics