【转】Phonegap离线调用SQLite数据库文件
于是采用PhoneGap SQLitePlugin,地址: https://github.com/lite4cordova/Cordova-SQLitePlugin为项目添加好插件之后,运行,带来另一个问题,执行insert语句依旧很慢。之后,便采用5000条语句使用一个事务的方式批量插入,对10万条数据进行了测试,如下:
executeSqlBatch icount:0 insertSumCount:20 Time:3:00:29 PM GMT+08:00 executeSqlBatch icount:1 insertSumCount:20 Time:3:00:32 PM GMT+08:00 executeSqlBatch icount:2 insertSumCount:20 Time:3:00:39 PM GMT+08:00 executeSqlBatch icount:3 insertSumCount:20 Time:3:00:48 PM GMT+08:00 executeSqlBatch icount:4 insertSumCount:20 Time:3:01:01 PM GMT+08:00 executeSqlBatch icount:5 insertSumCount:20 Time:3:01:16 PM GMT+08:00 executeSqlBatch icount:6 insertSumCount:20 Time:3:01:35 PM GMT+08:00 executeSqlBatch icount:7 insertSumCount:20 Time:3:01:58 PM GMT+08:00 executeSqlBatch icount:8 insertSumCount:20 Time:3:02:26 PM GMT+08:00 executeSqlBatch icount:9 insertSumCount:20 Time:3:02:56 PM GMT+08:00 executeSqlBatch icount:10 insertSumCount:20 Time:3:03:29 PM GMT+08:00 executeSqlBatch icount:11 insertSumCount:20 Time:3:04:06 PM GMT+08:00 executeSqlBatch icount:12 insertSumCount:20 Time:3:04:47 PM GMT+08:00 executeSqlBatch icount:13 insertSumCount:20 Time:3:05:31 PM GMT+08:00 executeSqlBatch icount:14 insertSumCount:20 Time:3:06:19 PM GMT+08:00 executeSqlBatch icount:15 insertSumCount:20 Time:3:07:08 PM GMT+08:00 executeSqlBatch icount:16 insertSumCount:20 Time:3:08:01 PM GMT+08:00 executeSqlBatch icount:17 insertSumCount:20 Time:3:08:58 PM GMT+08:00 executeSqlBatch icount:18 insertSumCount:20 Time:3:11:13 PM GMT+08:00 executeSqlBatch icount:19 insertSumCount:20 Time:3:12:17 PM GMT+08:00 executeSqlBatch icount:20 insertSumCount:20 Time:3:13:23 PM GMT+08:00
可 以看到,10万条insert语句,采用每5000条语句提交一次事务的方式,一共花了12分54秒。而且每次执行时间比前一次时间要长,并且随着数据量 越大,以后每次的执行时间将更长,因为sqlite采用的是文本形式的数据库,每次对数据库的操作都会进行I/O操作。显然,如此漫长的等待时间,客户是 难以接受的。
最后解决的办法是,将Sqlserver中现有的数据导出成sqlite数据库文件,如xxx.db,之后将该文件放在程序 中,待App第一次启动的时候,将该xxx.db数据库文件拷贝到相应的目录,如android默认是在/data/data/packagename /database目录下,iphone默认是在/Applications/APP串/Documents目录下。
所以,具体的解决办法如下:
Phonegap IOS版:
1,将需要导入的数据库文件拷贝到Resources目录下.
2, AppDelegate.m文件中添加如下代码:
- (void)createEditableCopyOfDatabaseIfNeeded {
// First, test for existence. BOOL success=NO;
BOOL success=NO;
NSString *dbFileName = @"import.db";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:dbFileName];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success){ NSLog(@"数据库存在");
return;}
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbFileName];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}else {
NSLog(@"createEditableCopyOfDatabaseIfNeeded initialize success");
} }
在didFinishLaunchingWithOptions中调用:
[self createEditableCopyOfDatabaseIfNeeded];
3, 在PhoneGap SQLitePlugin中打开数据库的代码为:
db = window.sqlitePlugin.openDatabase({name: "import.db"});
Phonegap Android版:
1,将需要导入的数据库文件拷贝到res/raw目录下.
2,添加DataBaseUtil.java文件
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException; public class DataBaseUtil { private Context context;
public static String dbName = "texonline.db";// 数据库的名字
private static String DATABASE_PATH;// 数据库在手机里的路径 public DataBaseUtil(Context context) {
this.context = context;
String packageName = context.getPackageName();
DATABASE_PATH="/data/data/"+packageName+"/databases/";
} /**
* 判断数据库是否存在
*
* @return false or true
*/
public boolean checkDataBase() {
SQLiteDatabase db = null;
try {
String databaseFilename = DATABASE_PATH + dbName;
System.out.println("checkDataBase=>"+databaseFilename);
db = SQLiteDatabase.openDatabase(databaseFilename, null,SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) { }
if (db != null) {
db.close();
}
return db != null ? true : false;
} /**
* 复制数据库到手机指定文件夹下
*
* @throws IOException
*/
public void copyDataBase() throws IOException {
String databaseFilenames = DATABASE_PATH + dbName;
File dir = new File(DATABASE_PATH);
if (!dir.exists())// 判断文件夹是否存在,不存在就新建一个
dir.mkdir();
FileOutputStream os = new FileOutputStream(databaseFilenames);// 得到数据库文件的写入流
InputStream is = context.getResources().openRawResource(R.raw.texonline);// 得到数据库文件的数据流
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0) {
os.write(buffer, 0, count);
os.flush();
}
is.close();
os.close();
System.out.println("copyDataBase success");
}
}
3,在继承自DroidGap的activity里添加如下方法,并在onCreate里调用。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set by <content src="index.html" /> in config.xml
super.setIntegerProperty("loadUrlTimeoutValue", 60000);
super.loadUrl(Config.getStartUrl(),10000);
copyDataBaseToPhone();
} private void copyDataBaseToPhone() {
DataBaseUtil util = new DataBaseUtil(this);
// 判断数据库是否存在
boolean dbExist = util.checkDataBase(); if (dbExist) {
Log.i("tag", "The database is exist.");
} else {// 不存在就把raw里的数据库写入手机
try {
util.copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
4,在PhoneGap SQLitePlugin中打开数据库的代码为:
db = window.sqlitePlugin.openDatabase({name: "import.db"});
【转】Phonegap离线调用SQLite数据库文件的更多相关文章
- RT/Metro商店应用如何调用SQLite数据库
RT/Metro商店应用如何调用SQLite数据库 使用前,要安装:SQLite for Windows Runtime (Windows 8.1)(一个VS插件).还有Visual C++ Runt ...
- Android虚拟机中的sqlite数据库文件
Android虚拟机中的sqlite数据库文件 ①
- 修复 SQLite 数据库文件
目 录 第1章 说明 1 1 下载SQLite Tools 1 2 运行 2 第1章 说明 笔者编写的一个程序,无法往 SQLite 数据库文件里写数据.使用SQLiteSpy打开该 ...
- SharedPreferences数据、openFileOutput文件、SQLite数据库文件存储位置
在模拟器中: SharedPreferences将XML文件保存在/data/data/<package name>/shared_prefs目录下, openFileOutput方法将文 ...
- WEKA从sqlite数据库文件导入数据
1.编写代码的方式 只需要在java工程中导入weka.jar和sqlite-jdbc-3.8.7.jar两个jar包, weka.jar可以在weka的安装路径下找到, sqlite-jdbc-3. ...
- 启动Android App时,动态将Sqlite数据库文件导入到手机中类方法
package com.aqioo.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStre ...
- ios创建的sqlite数据库文件如何从ios模拟器中导出
为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...
- SQL Server 链接服务器连接 SQLite数据库文件
SQL Server数据库允许通过数据库驱动程序连接各类数据库并进行操作.以下是在SQL Server 2012 R2中建立SQLite的链接服务器. 一.下载SQLite数据库的ODBC驱动程序: ...
- Android调用Sqlite数据库时自动生成db-journal文件的原因
数据库为了更好实现数据的安全性,一半都会有一个Log文件方便数据库出现意外时进行恢复操作等.Sqlite虽然是一个单文件数据库,但麻雀虽小五脏俱全,它也会有相应的安全机制存在 这个journal文件便 ...
随机推荐
- go的优缺点
1.1 不允许左花括号另起一行1.2 编译器莫名其妙地给行尾加上分号1.3 极度强调编译速度,不惜放弃本应提供的功能1.4 错误处理机制太原始1.5 垃圾回收器(GC)不完善.有重大缺陷1.6 禁止未 ...
- Linux功能-RPM命令详解
一.概述 RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”,用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布 ...
- long和Long的区别
Java中数据类型分两种:1.基本类型:long,int,byte,float,double2.对象类型:Long,Integer,Byte,Float,Double其它一切java提供的,或者你自己 ...
- openfire 介绍安装使用
Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议.Openfire安装和使用都非常简单,并利用Web进行管理.单台服务器可支持上万并发用户.您可以使用 ...
- 【转载】String、StringBuffer与StringBuilder之间区别
文章来源:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 这两天在看Java编程的书,看到String的时候将之前没有弄懂的 ...
- eclipse运行emulator时,PANIC:Could not open emulator的解决办法
使用eclipse启动emulator的时候,出现PANIC:Could not open emulator,模拟器无法正常的运行. 经过搜索得知,因为我的SDK的环境变量出问题,需要重新配置下环境变 ...
- 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)
题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...
- Android之界面刷新(invalidate和postInvalidate使用)
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用. Android提供了Inva ...
- Android软件开发需要学什么
首先,需要学习哪些Android开发技术? Android的开发技术很多,在开始学习的时候不可能一次性全部学会,也没有必要一开始都全部学会,但是有些技术是非常常用的,需要在开始时打好基础,这些技术时: ...
- apache开源项目-- Velocity
Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...