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


Posted in Javascript onFebruary 02, 2016

本文实例讲述了js+html5操作sqlite数据库的方法。分享给大家供大家参考,具体如下:

//copyright by lanxyou lanxyou[at]gmail.com
var lanxDB=function(dbname){
  var db=openDatabase(dbname,'1.0.0','',65536);
  return{
    //返回数据库名
    getDBName:function(){
      return dbname;
    },
    //初始化数据库,如果需要则创建表
    init:function(tableName,colums){
      this.switchTable(tableName);
      colums.length>0?this.createTable(colums):'';
      return this;
    },
    //创建表,colums:[name:字段名,type:字段类型]
    createTable:function(colums){
      var sql="CREATE TABLE IF NOT EXISTS " + this._table ;
      var t;
      if (colums instanceof Array && colums.length>0){
        t=[];
        for (var i in colums){
          t.push(colums[i].name+' '+colums[i].type);
        }
        t=t.join(', ');
      }else if(typeof colums=="object"){
        t+=colums.name+' '+colums.type;
      }
      sql=sql+" ("+t+")";
      var that=this;
      db.transaction(function (t) { 
        t.executeSql(sql) ;
   })
    },
    //切换表
    switchTable:function(tableName){
      this._table=tableName;
      return this;
    },
    //插入数据并执行回调函数,支持批量插入
    //data为Array类型,每一组值均为Object类型,每一个Obejct的属性应为表的字段名,对应要保存的值
    insertData:function(data,callback){
      var that=this;
      var sql="INSERT INTO "+this._table;
      if (data instanceof Array && data.length>0){
        var cols=[],qs=[];
        for (var i in data[0]){
          cols.push(i);
          qs.push('?');
        }
        sql+=" ("+cols.join(',')+") Values ("+qs.join(',')+")";
      }else{
        return false;
      }
      var p=[],
        d=data,
        pLenth=0,
        r=[];
      for (var i=0,dLength=d.length;i<dLength;i++){
        var k=[];
        for (var j in d[i]){
          k.push(d[i][j]);
        }
        p.push(k);
      }
      var queue=function(b,result){
        if (result){
          r.push(result.insertId ||result.rowsAffected);
        }
        if (p.length>0){
          db.transaction(function (t) { 
            t.executeSql(sql,p.shift(),queue,that.onfail);
          })
        }else{
          if (callback){
            callback.call(this,r);
          }
        }
      }
      queue();
    },
    _where:'',
    //where语句,支持自写和以对象属性值对的形式
    where:function(where){
      if (typeof where==='object'){
        var j=this.toArray(where);
        this._where=j.join(' and ');
      }else if (typeof where==='string'){
        this._where=where;
      }
      return this;
    },
    //更新数据,data为属性值对形式
    updateData:function(data,callback){
      var that=this;
      var sql="Update "+this._table;
      data=this.toArray(data).join(',');
      sql+=" Set "+data+" where "+this._where;
      this.doQuery(sql,callback);
    },
    //根据条件保存数据,如果存在则更新,不存在则插入数据
    saveData:function(data,callback){
      var sql="Select * from "+this._table+" where "+this._where;
      var that=this;
      this.doQuery(sql,function(r){
        if (r.length>0){
          that.updateData(data,callback);
        }else{
          that.insertData([data],callback);
        }
      });
    },
    //获取数据
    getData:function(callback){
      var that=this;
      var sql="Select * from "+that._table;
      that._where.length>0?sql+=" where "+that._where:"";
      that.doQuery(sql,callback);
    },
    //查询,内部方法
    doQuery:function(sql,callback){
      var that=this;
      var a=[];
      var bb=function(b,result){
        if (result.rows.length){
          for (var i=0;i<result.rows.length;i++){
            a.push(result.rows.item(i));
          }
        }else{
          a.push(result.rowsAffected);
        }
        if (callback){
          callback.call(that,a);
        }
      }
      db.transaction(function (t) { 
        t.executeSql(sql,[],bb,that.onfail) ;
      })
    },
    //根据条件删除数据
    deleteData:function(callback){
      var that=this;
      var sql="delete from "+that._table;
      that._where.length>0?sql+=" where "+that._where:'';
      that.doQuery(sql,callback);
    },
    //删除表
    dropTable:function(){
      var sql="DROP TABLE IF EXISTS "+this._table;
      this.doQuery(sql);
    },
    _error:'',
    onfail:function(t,e){
      this._error=e.message;
      console.log('----sqlite:'+e.message);
    },
    toArray:function(obj){
      var t=[];
      obj=obj || {};
      if (obj){
        for (var i in obj){
          t.push(i+"='"+obj[i]+"'");
        }
      }
      return t;
    }
  }
}
/*
examples:
var db=new lanxDB('testDB');
db.init('channel_list',[{name:'id',type:'integer primary key autoincrement'},{name:'name',type:'text'},{name:'link',type:'text'},{name:'cover',type:'text'},{name:'updatetime',type:'integer'},{name:'orders',type:'integer'}]);
db.init('feed_list',[{name:'parentid',type:'integer'},{name:'feed',type:'text'}]);
db.switchTable('channel_list').insertData([{name:'aa',link:'ss',updatetime:new Date().getTime()},{name:'bb',link:'kk',updatetime:new Date().getTime()}]);
db.where({name:'aa'}).getData(function(result){
  console.log(result);//result为Array
});
db.where({name:'aa'}).deleteData(function(result){
  console.log(result[0]);//删除条数
});
db.where({name:'bb'}).saveData({link:'jj'},function(result){
  console.log(result);//影响条数
})
})
*/

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery.Autocomplete实现自动完成功能(详解)
Jul 13 Javascript
解析jquery获取父窗口的元素
Jun 26 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
jquery获取form表单input元素值的简单实例
May 30 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 Javascript
Node.js 8 中的重要新特性
Jun 28 Javascript
vue cli使用绝对路径引用图片问题的解决
Dec 06 Javascript
vue新建项目并配置标准路由过程解析
Dec 09 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
js删除对象中的某一个字段的方法实现
Jan 11 Javascript
详解Webwork中Action 调用的方法
Feb 02 #Javascript
JavaScript File API文件上传预览
Feb 02 #Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 #Javascript
Webwork 实现文件上传下载代码详解
Feb 02 #Javascript
javascript自动切换焦点控制效果完整实例
Feb 02 #Javascript
原生js实现图片层叠轮播切换效果
Feb 02 #Javascript
Javascript实现的SHA-256加密算法完整实例
Feb 02 #Javascript
You might like
PHP中动态显示签名和ip原理
2007/03/28 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
js实现拖拽效果
2015/02/12 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python中set()函数简介及实例解析
2018/01/09 Python
python操作gitlab API过程解析
2019/12/27 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Django使用rest_framework写出API
2020/05/21 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
珍惜水资源建议书
2014/03/12 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
经济管理自荐书
2014/06/09 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
python运行脚本文件的三种方法实例
2022/06/25 Python