发布Sqlite数据库
前言
如何将Sqlite数据库与apk一同发布?刚开始用时有朋友告诉我直接用adb命令手工发布,或者写sql语句动态创建,感觉不太理想。得益于银河使者的实现基于Android的英文电子词典这篇文章,再经过文章2的补充以及实践得以完成,感谢大家的分享!
文章
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语句:
这个表用途不太清楚,但是如果用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,但没有测试过,不知道后续的版本会不会改进这个数据库发布的问题。