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

时间: 2024-10-08 22:37:15

websql的使用/phonegap操作数据库 sqlite的相关文章

使用phonegap操作数据库

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Database Example</title> <script type="text/javascript" charset="UTF-8" src="cordova.js"></script> <scri

sqlite:多线程操作数据库“database is locked”解决方法(二)

上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大量数据的情况下,延时会拖慢进度. 想出方法二: 1. 创建一个链表,链接如下格式的结构体,线程1,线程2,线程3......不直接改写数据库,而是把sql语句插入链表中: typedef struct { uint8_t *buf; uint32_t len; } sqlItem_t; 2. 创建一个独立的线

[Sqlite] 移动嵌入式数据库Sqlite的日常SQL操作语句汇总

序言:     嵌入式数据库Sqlite的基本sql使用汇总,使用测试起来,与关系型数据库mysql在语法上有很多的相似之处,先准备测试数据: CREATE TABLE COMPANY(ID INT NOT NULL, NAME VARCHAR(20),AGE INT,ADDRESS VARCHAR(20),SALARY DECIMAL(7,2)); INSERT INTO "COMPANY" VALUES(1,'Paul',32,'California',20000); INSERT

[Sqlite] 移动嵌入式数据库Sqlite日报SQL操作语句汇总

前言:     嵌入式数据库Sqlite基本sql使用摘要.使用测试,与关系数据库mysql在语法上有非常多的类似之处,先准备測试数据: CREATE TABLE COMPANY(ID INT NOT NULL, NAME VARCHAR(20),AGE INT,ADDRESS VARCHAR(20),SALARY DECIMAL(7,2)); INSERT INTO "COMPANY" VALUES(1,'Paul',32,'California',20000); INSERT IN

【转】afinal来操作android的数据库sqlite

今天给大家介绍下#afinal#来操作android的数据库sqlite. #afinal#是一个android的orm.ioc快速开发框架,里面包含了四大功能:空间的id绑定和事件绑定功能:网络图片的显示功能(里面包含了强大的缓存框架):数据库sqlite的操作功能:http数据的读取功能(支持ajax方式读取): #afinal#开源网址:https://github.com/yangfuhai/afinal 这篇文章主要是介绍afinal的功能之一FinalDb组件,其他组件请关注我的博客

Qt之操作数据库(SQLite)实例

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动程序与各种数据库的应用编程接口进行通信.Qt的桌面版(Desktop Edition)包括如下一些驱动程序: 驱动程序 数据库  QDB2 IBM DB2 7.1版以及更新的版本  QIBASE Borland InterBase QMYSQL MySql  QOCI 甲骨文公司(Oracle Ca

adb命令详解(二)——手机缺失sqlite3时操作数据库的多种解决方案

在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 下面我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方案. 1.当手机缺失sqlite3时,如何操作数据库 先来看看手机缺失sqlite3时候的效果图: 这个时候你想操作刚刚编写应用程序中执行的数据库文件内容,显然是执行不了sql语句的.下面我们将介绍三种方法让你可以查看应用程序下的数据库文件: ㈠向手机导入sqlite3文件 ①第一步,下载sqlite

Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题

做一个需要嵌入式数据库Sqlite 的unity3d项目,在pc机上运行良好,需要发布到Android平台上,于是,各种坑爹...会遇到找不到数据库文件的问题.当在pc机上使用sqlite时,当执行SqliteConnection dbConnection = new SqliteConnection("data source = test.db");语句时,如果有这个数据库文件则建立连接,如果没有则创建出这个文件,然后建立连接.当在Android平台上时,扯淡的事情就开始了,总之便不

使用内置函数操作数据库

0.视频:http://www.imooc.com/video/3383 1.笔记: ContentValues: 1)用于存储一组可以被ContentResolve处理的值: 2)代码示例: ContentValues values=new ContentValues();//类似hashMap key value values.put("name", "张三"); 3)执行对应的Sql操作: db.update("stutb", values