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 相关文章推荐
js和php如何获取当前url的内容
Sep 22 Javascript
Java/JS获取flash高宽的具体方法
Dec 27 Javascript
window.location的重写及判断location是否被重写
Sep 04 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
Three.js学习之网格
Aug 10 Javascript
javascript实现一个网页加载进度loading
Jan 04 Javascript
JavaScript原生节点操作小结
Jan 17 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
Apr 20 jQuery
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
May 03 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 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下实现折线图效果的代码
2007/04/28 PHP
php实现Mysql简易操作类
2015/10/11 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
php blowfish加密解密算法
2016/07/02 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Python运算符+与+=的方法实例
2021/02/18 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
小学生家长评语大全
2014/02/10 职场文书
会计助理岗位职责
2014/02/17 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
捐资助学倡议书
2014/04/15 职场文书
初中英语课后反思
2014/04/25 职场文书
安全演讲稿大全
2014/05/09 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
会计专业自荐信范文
2019/05/22 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技