PhoneGap 数据库操作
1,openDatabase
phonegap官方文档中已经很清楚的标明,如果使用一个数据库首先要用window对象进行创建:
var dbShell = window.openDatabase(name, version, display_name, size);
参数:
- name:标明数据库的名称
- version:版本号
- display_name:显示名称,与name的区别在于数据库表中,分别有这两个字段。
- size:数据库的大小
详解:
之前,在利用工厂模式,创建了一个数据库对象:
function db(name,ver,dis,size){
.......
var _db = window.openDatabase(name,ver,dis,size);
_db.transaction();
}
调用function方法进行创建db对象时,new db(),里面传入的参数可以是需要的四个参数,但是,我用下面这个方法的时候就遇到了一个问题,先看方法:
var newdb = {
_db:'',
db:function(){
if(!newdb._db){
newdb._db = window.openDatabase("database","1.0","mydatabase",10000);
return new db(newdb._db);
}
}
}
疑惑:在进行调用工厂类创建数据库的时候,传入的参数竟然可以不是给定的四个参数,而是直接的传入了一个数据库对象;并且当获取到从工厂类中生成的数据库对象,其中也存在一个_db,两个数据库,究竟在执行transaction事务的时候调用的是哪一个?
上面说了这么多,都是为了铺陈:
其中的过程是这样的:
//首先程序会为当前应用在data文件夹下创建一个以当前应用包名的文件夹
//当运行window.openDatabase方法后,会在该文件夹下创建一个app_database文件夹;里面创建一个Databases.db数据库文件,会在这个数据库文件中创建两个表:Databases和Origins;Databases存放在创建数据库时,填写的参数信息,Origins中存放数据库文件夹路径
图1:Databases数据库中的两个表
图2:Databases表
Databases表中创建的数据库文件夹路径(origin字段)和文件路径(path字段),默认第一次创建是在file__0/ 0000000000000001.db.这个才是我们真正创建的数据库文件。你调用数据库对象进行数据库操作都是在这个数据库下进行的。
当我们指定的数据库不存在时会帮我们新建一个数据库,当存在了只会返回一个已有的数据库对象。
2,SQLTransaction对象
该对象是用来操作executesql方法;
执行transaction方法,在接受一个SQLTransaction对象的同时,它还会执行其中的回调函数:
db.transaction(populateDB, errorCB, successCB);
当你调用Databases对象的transaction方法后,其回调函数将被调用并接收一个SQLTransaction对象。用户可以通过SQLTransaction对象多次调用executeSql来建立一个数据库事务处理。
function populateDB(tx) {
tx.executeSql('DROP TABLE DEMO IF EXISTS');
tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
} function errorCB(err) {
alert("Error processing SQL: "+err);
}
function successCB() {
alert("success!");
} var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
db.transaction(populateDB, errorCB, successCB);
3,SQLResultSet对象
执行executesql方法,返回对象:SQLResultSet,对象中的属性
- insertId:SQLResultSet对象通过SQL语句插入到数据库的行记录的行ID。[译注:如果插入多行的时候,返回最后一个行的ID]
- rowAffected:被SQL语句改变的记录行数,如果语句没有影响任何行则设置为0。
- rows:是一个SQLResultSetRowList对象,表示返回的多条记录。如果没有返回任何记录,则此对象为空。
SQLResultSet对象可以在执行executesql的成功回调函数中获取到:
参考文档中的例子:tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
第一个参数为要执行的数据库语句。与普通操纵数据库语句没太大区别。
第二个参数为一个数组对象,存放sql语句中需要的参数的数组,就是sql语句里面出现的?所需要的参数。
第三个参数为执行成功后,调用的方法,在这个函数中可以获取到结果集results.是一个sqlresultset对象
第四个参数为执行错误时候调用的方法。
接下来我们看一下querySuccess这个回调方法。
function querySuccess(tx, results) {
// 因为没有插入记录,所以返回值为空
console.log("Insert ID = " + results.insertId);
// 因为这是一条查询语句所以返回值为0
console.log("Rows Affected = " + results.rowAffected);
// 返回查询到的记录行数量
console.log("Insert ID = " + results.rows.length);
}
4,SQLResultSetList对象
包含SQL查询所返回的所有行数据。
属性:
- length: SQL查询所返回的记录行数。
方法:
- item:根据指定索引返回一个行记录的JavaScript对象。
总结:
db.transaction(SQLTransaction,err,sucss);
SQLResultSet = SQLTransaction.executesql("select * from",[],succ,err);
SQLResultSetList = SQLResultSet.rows;
item = SQLResultSetList.item(i);
phonegap 中与存储相关的对象有
Database 数据库对象
SQLTransaction 事物对象
SQLResultSet Sql结果对象
SQLResultSetList 查询返回数据集对象
SQLError Sql错误对象
localStorage 本地存储对象
Database 数据库对象:
通过openDatabase方法获得该对象
例如:
window.openDatabase(database_name, database_version, database_displayname, database_size);
var dbOne = window.openDatabase("test1", "1.0", "Test DB", 1000000);
database_name:数据库名字,
database_version:数据库版本
database_displayname:显示名字
database_size:数据库大小
创建完成后便会在/data/data/包名/app_database/dbOne.db找到刚才创建的数据库文件,可以利用DDMS查看
SQLTransaction 事物对象
phonegap没有提供直接获取事物对象的方法,而是利用Database 对象transaction方法,将事物对象传递给一个回调
函数,例如
dbOne.transaction(createATable, errorCreateTable, successCreateTable);
createATable即是一个回调函数,会将事物对象以参数的形式传进去,createATable函数
createATable(trans){
}
这里的trans即是传递进的事物对象,有了事物对象就可利用事物对象的executeSql方法执行sql语句
例如
createATable(trans){
trans.executeSql('CREATE TABLE IF NOT EXISTS MyTab (id unique, data)');
tx.executeSql('INSERT INTO MyTab (id, data) VALUES (1, "First row")');
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}
这样就利用数据库的事物对象创建了MyTab表并且插入了两条数据
SQLError 错误对象
SQLError对象也是以参数的形式传递给一个回调函数
在上面的方法
dbOne.transaction(createATable, errorCreateTable, successCreateTable);
errorCreateTable就是一个回调函数,如果dbOne.transaction函数执行失败,就会调用回调函数errorCreateTable
同时将SQLError对象传递进去
例如
function errorCreateTable(err)
{
alert("err code:"+err.code+"err message:"+err.message');
}
code和message为SQLError对象的两个属性
SQLResultSet对象
该对象是由事物对象的executeSql方法传递给回调函数,在回调函数中在对结构集对象操作,例如
tx.executeSql('SELECT * FROM MyTab', [], querySuccess, errorCB);
querySuccess即是成功执行后的回调函数,
function querySuccess(trans, results) {
alert("Returned rows = " + results.rows.length);
if (!resultSet.rowsAffected) {
alert('No rows affected!');
return false;
}
该函数接受两个参数:事物对象和结果集对象SQLResultSet,SQLResultSet包含三个属性
insertId 函数插入数据行的row ID
rowsAffected 改变的数据行的数量
rows:rows是一个SQLResultSetList 对象,该对象代表执行查询sql时返回的所有数据行
SQLResultSetList 查询返回的结果集对象
该对象包含一个属性 length(返回的数据行数量),一个方法item(该方法返回某个特定的数据行0
例
function querySuccess(trans, results) {
var len = results.rows.length;
console.log("MyTab table: " + len + " rows found.");
for (var i=0; i<len; i++){
console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data = " + results.rows.item(i).data);
}
}
localStorage本地存储对象
该对象和手机设备上的存储没有关系,而是和html5中的本地存储提供的一个接口
一个完整的例子
html部分
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
</head>
<body>
<button onclick="pgapStorage()">pgapStorage</button>
</body>
<script type="text/javascript" src="cordova-2.1.0.js"></script>
<script type="text/javascript" src="pgapstorage.js"></script>
</html>
js部分
function pgapStorage(){
//创建或者打开数据库,大小100000 bytes
var dbOne = window.openDatabase("myDataBase","1.0","phonegapdatabase",100000);
//将事物对象SQLTransaction传给createATable函数,如果发生错误将SQLError对象传给errorCreateTable函数
dbOne.transaction(createATable, errorCreateTableTrans, successCreateTableTrans);
}
//执行回调函数createATable,创建表MyTab并且插入数据
function createATable(trans){
trans.executeSql('DROP TABLE IF EXISTS MyTab');
trans.executeSql('CREATE TABLE IF NOT EXISTS MyTab (id unique, data)');
trans.executeSql('INSERT INTO MyTab (id, data) VALUES (1, "First row")');
trans.executeSql('INSERT INTO MyTab (id, data) VALUES (2, "Second row")');
}
//dbOne.transaction()执行失败后执行,并传递SQLError对象
function errorCreateTableTrans(err){
alert("err code:"+err.code+"err message:"+err.message);
}
//dbOne.transaction()执行成功后会执行
function successCreateTableTrans(){
alert("successfully");
var dbOne = window.openDatabase("myDataBase","1.0","phonegapdatabase",100000);
//创建新的事物对象,并传递给回调函数
dbOne.transaction(queryMyTab,successQueryMyTabTrans,errorQueryMyTabTrans);
}
function successQueryMyTabTrans(){
alert("successQueryMyTabTrans");
}
function errorQueryMyTabTrans(){
alert("err code:"+err.code+"err message:"+err.message);
}
//查询
function queryMyTab(trans){
//查询成功后执行successQueryMyTab回调函数,失败执行errorQueryMyTab函数
trans.executeSql('SELECT * FROM MyTab', [], successQueryMyTab, errorQueryMyTab);
}
//executeSql执行成功后执行,并将SQLTransaction、SQLResultSet两个对象传递给函数 successQueryMyTab
function successQueryMyTab(trans,results){
var len = results.rows.length;
alert(len);
//利用弹出框显示查询的结果
for (var i=0; i<len; i++){
alert("Row = " + i + " ID = " + results.rows.item(i).id + " Data = " + results.rows.item(i).data);
}
}
//executeSql()执行失败后执行
function errorQueryMyTab(err){
alert("err code:"+err.code+"err message:"+err.message);
}
转自:http://www.cnblogs.com/mingforyou/archive/2013/01/29/2881795.html
PhoneGap 数据库操作的更多相关文章
- (转)phonegap 数据库详解
原文:http://firepix.iteye.com/blog/1618343 phonegap 数据库详解 博客分类: web App phonegap 今天就把之前使用pho ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- MySQL 系列(二) 你不知道的数据库操作
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...
- ABP创建数据库操作步骤
1 ABP创建数据库操作步骤 1.1 SimpleTaskSystem.Web项目中的Web.config文件修改数据库配置. <add name="Default" pro ...
- 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- django数据库操作和中间件
数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...
- [Android Pro] 完美Android Cursor使用例子(Android数据库操作)
reference to : http://www.ablanxue.com/prone_10575_1.html 完美 Android Cursor使用例子(Android数据库操作),Androi ...
- phpcms v9 中的数据库操作函数
1.查询 $this->select($where = '', $data = '*', $limit = '', $order = '', $group = '', $key='') 返回 ...
随机推荐
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requiremen ...
- Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录【已成功实例】
本文转自https://blog.csdn.net/qjc_501165091/article/details/51278696 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口 ...
- Mui 下拉刷新,刷新完成功能实现
Mui中,正在刷新后,就直接回弹了,没有刷新完成这个过程,然后我就在中间添加了一个过程. 代码如下: //-----------日期格式化------------- function form ...
- Windows下Phalcon的安装以及phpstorm识别phalcon语法及提示
1.由于Phalcon是C语言写的一个扩展,所以需要安装这个扩展php_phalcon.dll,下载地址https://github.com/phalcon/cphalcon/releases, 然后 ...
- hash bucket
什么是bucket bucket的英文解释: Hash table lookup operations are often O(n/m) (where n is the number of objec ...
- JSTL标签 使用总结,foreach
最近开发一个网站,经常使用JSTL,这种语法与以前的不同,开始用着非常吃力,今天总结一下,供大家参考. 一.前言 JSTL全名为JavaServer Pages Standard Tag Librar ...
- Spring MVC 中使用 Google kaptcha 验证码
验证码是抵抗批量操作和恶意登录最有效的方式之一. 验证码从产生到现在已经衍生出了很多分支.方式.google kaptcha 是一个非常实用的验证码生成类库. 通过灵活的配置生成各种样式的验证码,并将 ...
- fiddler展示serverIP方法
转载自:http://www.xuanfengge.com/fiddler-displays-the-set-ip-method.html 前言 由于web前端在多个环境中开发,需要经常更换host, ...
- 使用Jenkins搭建持续集成(CI)环境
转自:http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java ...
- ASP.NET MVC 4 简介
介绍 使用Visual Studio 2010开发的话,首先需要安装MVC4,可以参考另一篇文章 进行安装. ASP.NET MVC 运行流程 (Clinet) Http Request 客户端发起 ...