websql的使用/phonegap操作数据库 sqlite
对websql的常用操作进行了一个封装,项目是基于phonegap的,不过phonegap默认已经集成了数据库操作的插件,所以无需再配置什么,直接用就可以了:
/**
*数据库操作辅助类,定义对象、数据操作方法都在这里定义
*/
var dbname='mydb';
var version='1.1';
var dbdesc='mydb'; var table_picture='be_picture'; var dbsize=30000;
var db=null; /**
* 打开数据库
* @returns {Boolean}
*/
function openDB(callback){
try{
if (!window.openDatabase) {
console.log('该浏览器不支持数据库');
return false;
}
db = window.openDatabase(dbname, version, dbdesc, dbsize);
return true;
}catch(e){
if(e==2){
console.log("数据库版本无效");
}else{
console.log("未知错误 "+e+".");
}
return false;
}
} /**
* 执行一段sql
* @param sql
*/
function execSql(sql,param,callback){
if(db==null){openDB();}
db.transaction(function(tx) {
tx.executeSql(sql,param, function(tx, result) {
if(typeof(callback) == 'function') {callback(true)}
return true;
}, function(tx, error) {
if(typeof(callback) == 'function') {callback(false)}
console.log(error);
return false;
});
});
} var pictureFields=[
'id',
'app_flow_no',
'ptr_type',
'ptr_name',
'ptr_address',
'blurred',
'original',
'local_address'
] /**
* 初始化数据库
*/
function initDB(){
if(db==null){openDB();}
createTable(table_picture,pictureFields,{"id":"primary key","app_flow_no":"not null"});
} /**
* 创建数据库
* @param tableName 表名称
* @param fields 表字段
* @param constraint 约束或者字段的其他补充,可以为空,
* 格式如:{"id":"integer primary key autoincrement","app_flow_no":"not null"}
*/
function createTable(tableName,fields,constraint){ if(db==null){openDB();}
var sql = 'CREATE TABLE IF NOT EXISTS '+tableName+' (';
for(i in fields){
var key = "";
if(typeof(constraint)!="undefined" && typeof(constraint[fields[i]]) !="undefined"){
key = " "+constraint[fields[i]];
}
sql+=fields[i]+key+",";
}
sql = sql.substr(0,sql.length-1);
sql += ")";
//log(sql);
execSql(sql);
} /**
* 更新数据
* @param tableName 表名称
* @param setFields 要更新的字段数组
* @param setParams 要更新的字段对应的参数数组
* @param whereStr where语句,如果没有可不传,不包含where关键字,参数用?代替,如:id=? and name=?
* @param wherParams where语句用到的参数数组,如['111','2222']
*/
function updateTable(tableName,setFields,setParams,whereStr,wherParams){
var sql = "update "+tableName+" set ";
for(i in setFields){
sql+=setFields[i]+"=?,";
}
sql = sql.substr(0,sql.length-1);
if(typeof(whereStr)!="undefined" && typeof(wherParams)!="undefined"
&& whereStr!=""){
sql += " where " + whereStr;
setParams = setParams.concat(wherParams);
}
execSql(sql,setParams);
} /**
* 插入数据
* @param tableName
* @param insertFields
* @param insertParams
*/
function insertTable(tableName,insertFields,insertParams){
var sql = "insert into "+tableName+" (";
var sql2 = " values(";
for(i in insertFields){
sql+=insertFields[i]+",";
sql2 +="?,"
}
sql = sql.substr(0,sql.length-1);
sql2 = sql2.substr(0,sql2.length-1);
sql += ")";
sql2 += ")";
execSql(sql+sql2,insertParams);
} /**
* 删除数据
* @param tableName
* @param whereStr
* @param wherParams
*/
function deleteRow(tableName,whereStr,wherParams){
var sql = "delete from "+tableName;
if(typeof(whereStr)!="undefined" && typeof(wherParams)!="undefined"
&& whereStr!=""){
sql += " where " + whereStr;
}
execSql(sql,wherParams);
} /**
* 查询
* @param tableName
* @param selectFields select的字段,用逗号分开,如果全部传"*"
* @param whereStr where语句,参数用?代替
* @param wherParams 参数数组
* @callback 必填,返回的对象会放在callback函数作为参数传递
*/
function select(tableName,selectFields,whereStr,wherParams,callback){
if(db==null){openDB();}
var sql = "SELECT "+selectFields+" FROM "+tableName;
if(typeof(whereStr)!="undefined" && typeof(wherParams)!="undefined"
&& whereStr!=""){
sql += " where " + whereStr;
}
db.transaction(function(tx){
tx.executeSql(sql,wherParams,function(tx,results){
if(results.rows.length<1){
if (typeof(callback) == 'function') {callback(false)} //没有数据
}else{
if(typeof(callback) == 'function') {callback(results.rows)}
}
},function(tx,error){
return false;
});
});
} /**
* 插入或更新
* @param tableName
* @param insertFields
* @param insertParams
* @param key 根据该key来判断是否有数据
* @param keyVal
*/
function saveOrUpdate(tableName,insertFields,insertParams,key,keyVal){
if(typeof(key)!="undefined" && typeof(keyVal)!="undefined"
&& key!=""){
select(tableName,insertFields[0],key+"=?",[keyVal],function(rows){
if(rows){
updateTable(tableName,insertFields,insertParams,key+"=?",[keyVal]);
}else{
insertFields.push(key);
insertParams.push(keyVal);
insertTable(tableName,insertFields,insertParams);
}
})
}else{
insertTable(tableName,insertFields,insertParams);
}
}
查询:
select(table_picture,"*","id=?",[id],function(rows){
if(rows){
//如果查询到数据
}
})
注意:因为websql是异步执行的,要获取到返回的结果然后进一步操作,需要传入回调函数,如上面的function(rows)....
插入或者更新:
saveOrUpdate(table_picture,['id','app_flow_no','original','ptr_type','ptr_name'],[pic.id,pic.appFlowNo,pic.original,pic.ptrType,pic.ptrName],'id',pic.id);
删除:
deleteRow(table_picture,"id=?",[123])
转自:http://blog.csdn.net/linshutao/article/details/21398483
websql的使用/phonegap操作数据库 sqlite的更多相关文章
- QT 操作数据库SQLite实例
#include "widget.h" #include <QApplication> #include <QtSql> #include <QTex ...
- iOS - SQLite Database 操作数据库
iOS - SQLite Database 操作数据库 Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...
- iOS基础 - 数据库-SQLite
一.iOS应用数据存取的常用方式 XML属性列表 —— PList NSKeyedArchiver 归档 Preference(偏好设置) SQLite3 Core Data(以面向对象的方式操作数据 ...
- 数据库-SQLite
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 数据库-SQLite 技术博客http:// ...
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- Qt之操作数据库(SQLite)
SQLite 简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...
- iOS 数据储存--SQLite 操作数据库-FMDB,sqlite数据类型,保存图片,demo
1.SQLite 语句中 数据类型的储存 /* 不区分大小写 char(长度).字符串 NULL. 空值 INTEGER. 整型 REAL.浮点型 TEXT.文本类型 BLOB. 二进制类型,用来存储 ...
- Qt之操作数据库(SQLite)实例
QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动 ...
- android: SQLite使用 SQL 操作数据库
虽然 Android 已经给我们提供了很多非常方便的 API 用于操作数据库,不过总会有一些 人不习惯去使用这些辅助性的方法,而是更加青睐于直接使用 SQL 来操作数据库.这种人 一般都是属于 SQL ...
随机推荐
- conda虚拟环境
https://blog.csdn.net/lyy14011305/article/details/59500819 1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是 ...
- Python中多进程的使用
进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...
- postgre 导出单表和导入
pg除了可以通过dump的方式导入和导出.如果只是导出数据,可以直接使用copy 导出 COPY user TO '/tmp/data/test.csv' WITH csv; COPY user(na ...
- 微信小程序 多个视频播放器
大致思路就是,wx:for="{{ list }}"下两个view,一个视频video,另一个封面image(客户需求,要可以自定义封面).主要控制变量是playIndex,当点击 ...
- list与Set、Map区别及适用场景
1.List,Set都是继承自Collection接口,Map则不是 2.List特点: 元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放 ...
- python实现模拟登录
本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程. 当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...). ...
- Swap 分区的2种方式 详解与例子
安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swap分区.下面介绍这两种方法: 第一您必须有root权限,过程中一定要 ...
- PCA实现
代码实现分成好多种层级,有的代码只使用标准库实现,有的代码基于其它库实现,有的代码直接调用库中现有的实现. 在本文中,按照不同的层级分别实现PCA 对于分类问题基本任务可以描述如下 x11 x12 x ...
- html中<a>标签的种类
在html中a 标签是一个链接标签,然而a 标签也有非常多的种类,在此做一个小结. 一.普通链接 <a href="http://www.baidu.com">百度&l ...
- Nginx 访问日志配置
一.Nginx 访问日志介绍 Nginx 软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由 ngx_http_log_module 模块负责. 二. ...