android中实现sqlite打包到APK发布

网上能找到很多这样的sqlite数据库打包随android应用发布的文章,

但是最少有80%以上应该都是直接转出来的,根本没有尝试操作过,

我这两天也在做数据库的打包工作,

在网上寻觅了好几篇,大同小异,代码相当,

但是整整试了两天多,代码都不好使,在代码里面加了不少日志,

但是都出现异常,我把最新总结的代码贴出来,供需要的参考。

功能:

正常的应用数据库放在/data/data/包名/database/test.db,应用发布时,这个数据库不会随着应用一起发布,

所以为了让我们已经准备好的数据正常使用,必须能实现数据库自身复制到sd卡下面,

实现拷贝res/raw/test.db下资源拷贝到SD卡下的/mnt/sdcard/test/test.db

代码如下:

package zcping.syan.DBDefinition;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import zcping.syan.DragonBaby.R;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class ReleaseDataBaseActivity{
/** Called when the activity is first created. */
//SD卡下的目录
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath() + "/db_exam";
//数据库名
private final String DATABASE_FILENAME = "db_exam.db";
//这个context是必需的,没有context,怎么都不能实现数据库的拷贝操作;
private Context context;
//构造函数必需传入Context,数据库的操作都带有这个参数的传入
public ReleaseDataBaseActivity(Context ctx) {
this.context = ctx;
}

public SQLiteDatabase OpenDataBase() {
try {
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
//判断SD卡下是否存在存放数据库的目录,如果不存在,新建目录
if (!dir.exists()) {
dir.mkdir();
Log.i("ReleaseDataBaseActivity", "dir made:" + DATABASE_PATH);
} else {
Log.i("ReleaseDataBaseActivity", "dir exist:" + DATABASE_PATH);
}
try {
//如果数据库已经在SD卡的目录下存在,那么不需要重新创建,否则创建文件,并拷贝/res/raw下面的数据库文件
if (!(new File(databaseFilename)).exists()) {
Log.i("ReleaseDataBaseActivity", "file not exist:"
+ databaseFilename);
///res/raw数据库作为输出流
InputStream is = this.context.getResources().openRawResource(
R.raw.db_exam);
//测试用
int size = is.available();
Log.i( "ReleaseDataBaseActivity", "DATABASE_SIZE:" + 1 );
Log.i("ReleaseDataBaseActivity", "count:" + 0);
//用于存放数据库信息的数据流
FileOutputStream fos = new FileOutputStream(
databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
Log.i("ReleaseDataBaseActivity", "count:" + count);
//把数据写入SD卡目录下
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
//实例化sd卡上得数据库,database作为返回值,是后面所有插入,删除,查询操作的借口。
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFilename, null);
return database;

} catch (Exception e) {
}
return null;
}
}

经过测试,绝对好使,希望对大家有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值