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 相关文章推荐
checkbox 多选框 联动实现代码
Oct 22 Javascript
javascript void(0)的妙用
Oct 21 Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
Jun 24 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
vue绑定的点击事件阻止冒泡的实例
Feb 08 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
May 04 jQuery
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 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 操作文件的一些FAQ总结
2009/02/12 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
js表单验证实例讲解
2016/03/31 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
koa socket即时通讯的示例代码
2018/09/07 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
Django用户身份验证完成示例代码
2020/04/03 Python
python os模块在系统管理中的应用
2020/06/22 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
北承题目(C++)
2012/05/16 面试题
教师找工作推荐信
2013/11/23 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
采购主管岗位职责
2014/02/01 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
街道社区活动报告
2015/02/05 职场文书
办公室个人总结
2015/02/28 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
MySQL之DML语言
2021/04/05 MySQL
Node与Python 双向通信的实现代码
2021/07/16 Javascript
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python