`

另一个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操作类实例

    首先定义了一个包含多条创建表SQL语句的数组`tbs`,然后创建了一个SQLite操作类的实例`db`,并调用`query`方法执行插入和查询操作。例如,在插入操作中使用占位符`?`来防止SQL注入,并在查询操作中,通过回调函数...

    Nodejs操作Sqlite3数据库封装

    在Node.js环境中,SQLite3是一个常用的轻量级数据库,它不需要单独的服务进程,可以直接在内存中或磁盘上创建数据库文件。本篇文章将深入探讨如何使用`node-sqlite3`库来操作SQLite3数据库,并对其进行封装,以便于...

    html5+js 读写sqlite增删改查

    通过JavaScript,我们可以创建一个SQLite数据库,定义表结构,并执行SQL语句。 1. **创建数据库**: 使用`openDatabase`函数创建数据库。例如: ```javascript var db = openDatabase("MyDB", "1.0", "Demo DB",...

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

    在本文中,我们将使用 JavaScript 封装一个 HTML5 操作 SQLite 数据库的类,称为 `lanxDB`。该类提供了对 SQLite 数据库的基本操作,包括创建表、插入数据、切换表等。 lanxDB 类的方法 getDBName 方法 `...

    SQLite4Unity3d

    以下是一些关键的SQLite操作示例: 1. **打开数据库**: ```csharp string dbPath = Application.dataPath + "/Resources/MyDatabase.db"; SQLiteConnection conn = new SQLiteConnection(dbPath); conn.Open()...

    Air Flex Sqlite通信

    在IT行业中,Adobe AIR(Adobe Integrated Runtime)是一个跨平台的应用程序运行环境,允许开发者使用Flash、Flex、HTML和JavaScript等技术构建桌面应用程序。本示例着重于“Air Flex Sqlite通信”,即如何在Adobe ...

    Flask+sqlite实现学生信息管理系统

    本资源利用Flask和SQLite数据库创建了一个学生信息管理系统,非常适合初学者进行实践和学习。 首先,让我们详细了解Flask。Flask是一个基于Werkzeug WSGI工具箱和Jinja2模板引擎的微框架。它的“微”意味着核心非常...

    数据库文件为sqlite的web项目

    【jQuery】是一个JavaScript库,极大地简化了JavaScript编程,特别是在DOM操作、事件处理和Ajax交互方面。在Web项目中,jQuery通常用于动态更新页面内容,实现用户友好的交互效果,如表格排序、下拉菜单、弹出框等。...

    Android Sqlite使用Deno

    在Android中,Deno可以作为一个库引入,帮助开发者更方便地处理SQLite操作。Deno提供了更简洁的API和异步处理能力,使得与数据库的交互更加直观。例如,你可以使用Deno的SQLite库(如`deno-sqlite`)编写如下的代码...

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

    SQLite是一个轻量级的、嵌入式的关系型数据库,适用于客户端存储数据。本文将深入探讨如何使用JavaScript封装HTML5操作SQLite数据库的类,并提供具体使用技巧。 首先,我们需要了解Web SQL API的基本用法。`open...

    Python-使用Flask和sqlite3编写的项目目录应用程序

    在Python的Web开发领域,Flask是一个轻量级的Web应用框架,而sqlite3则是Python标准库中的一个模块,用于处理嵌入式SQL数据库。这个名为“Python-使用Flask和sqlite3编写的项目目录应用程序”的项目,显然是利用这...

    asp.net mvc4 +sqlite

    ASP.NET MVC4与SQLite是一个强大的组合,用于构建高效、轻量级的Web应用程序。ASP.NET MVC4是一个基于模型-视图-控制器(MVC)设计模式的开源框架,它允许开发者构建可维护、可测试的Web应用。SQLite则是一个便携式...

    sqlite_Overprint.zip

    在"sqlite_Overprint"这个入门级的demo中,你可能会找到以上步骤的具体实现,包括数据库操作类的设计、WinForm控件与数据库的绑定以及Web服务接口的编写。这些示例代码可以帮助初学者快速理解如何在C#环境中有效利用...

    SQLiteStudio数据库包

    SQLiteStudio是一款功能强大的SQLite数据库管理工具,它提供了一个直观的用户界面,使得数据库操作变得简单易行。这个压缩包文件包含了一系列与SQLiteStudio运行相关的组件和库文件,这些文件对于理解SQLite数据库...

    MonoData.Sqlite system.data sysytem.Json.dll

    这是一个处理 JSON(JavaScript Object Notation)数据的库。JSON 是一种轻量级的数据交换格式,常用于 Web 服务和客户端之间的数据传输。Unity 中,当你需要序列化和反序列化对象为 JSON 格式,或者解析从服务器...

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

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

    unity SQLite 所需类库Plugins资源

    5. **错误处理**:由于SQLite操作可能因各种原因失败(如权限问题、数据库文件损坏等),确保在代码中添加适当的错误处理机制,以便在出现问题时能正确处理。 总的来说,这个"unity SQLite 所需类库Plugins资源...

    php sqlite 网站管理系统

    3. PDO(PHP Data Objects)扩展:PDO是PHP的一个扩展,提供了统一的接口来访问各种数据库。在PHP中使用SQLite通常会通过PDO_SQLite驱动,它允许执行SQL语句、处理结果集、事务管理和错误处理。 4. MVC(Model-View...

    SQLiteStudio.zip

    SQLiteStudio是一款功能强大的SQLite数据库管理工具,它支持在多种操作系统上运行,包括Windows、Linux和macOS。在Android开发中,SQLite通常是应用内置数据库的选择,因为它轻量级且易于使用。通过SQLiteStudio,...

Global site tag (gtag.js) - Google Analytics