发布Sqlite数据库

前言

如何将Sqlite数据库与apk一同发布?刚开始用时有朋友告诉我直接用adb命令手工发布,或者写sql语句动态创建,感觉不太理想。得益于银河使者实现基于Android的英文电子词典这篇文章,再经过文章2的补充以及实践得以完成,感谢大家的分享!

文章

1.  实现基于Android的英文电子词典

2.  Using your own SQLite database in Android applications

3.  Android Asset,res/raw限制文件大小UNCOMPRESS为1MB

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com

农民伯伯: http://www.cnblogs.com/over140/   

正文

一、准备

1.1  准备目录

在Android项目工程res下新建raw文件夹,在这个文件夹里面的文件不会被编译压缩。

1.2  准备数据库

新建或拷贝一个数据库,然后打开,依次执行以下两条SQL语句:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'zh_CN')
INSERT INTO "android_metadata" VALUES ('zh_CN')

这个表用途不太清楚,但是如果用Android sqlite API创建一个数据库的话,会默认带上这个表,而且少了还不行,会报错。

二、实现代码

    /**

*是否完成初始化

*/

privatestaticbooleanisInit=false;

/**

*初始化数据库

*@paramcontext

*/

synchronizedpublicstaticvoidinit(Contextcontext)

{

if(isInit)

return;

//输出路径

StringoutFileName=DATABASE_PATH+DATABASE_NAME;

//检测是否已经创建

Filedir=newFile(outFileName);

if(dir.exists())

return;

//检测/创建数据库的文件夹

dir=newFile(DATABASE_PATH);

if(!dir.exists())

dir.mkdir();

InputStreaminput=null;

OutputStreamoutput=null;

//从资源中读取数据库流

input=context.getResources().openRawResource(R.raw.db);

try{

output=newFileOutputStream(outFileName);

//拷贝到输出流

byte[]buffer=newbyte[2048];

intlength;

while((length=input.read(buffer))>0){

output.write(buffer,0,length);

}

}catch(FileNotFoundExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}finally{

//关闭输出流

try{

output.flush();

output.close();

}catch(IOExceptione){

}

//关闭输入流

try{

input.close();

}catch(IOExceptione){

}

}

isInit=true;

    }

代码说明:

a).  在主窗口(Activity)中调用一次即可,随后直接用SQLiteDatabase.openDatabase操作使用即可。

结束 

注意文章3,但没有测试过,不知道后续的版本会不会改进这个数据库发布的问题。

相关推荐