今天测试项目,需要将assets目录下的数据库拷贝到data/data/***/databases/下,发现第一次访问数据库时,总是会崩掉,调试了半天,发现建立输出流FileOutputStream时总是没有成功,很奇怪怎么会出现这种问题,因为下意识里都是没有该路径,就会自动创建,不会出现无法访问的问题,继续努力吧,先把有问题的代码发出来做记录:
// 获取所需database的绝对路径
String dbPath = mContext.getDatabasePath(S_DBContext.ProvinceInfo.DATABASE_NAME).toString();
InputStream istream = null;
OutputStream ostream = null;
try{
// 将assets目录下的数据库拷贝到当前应用包名的数据库目录下
AssetManager am = mContext.getAssets();
istream = am.open(S_DBContext.ProvinceInfo.DATABASE_NAME);
// 执行该行时出错
ostream = new FileOutputStream(dbPath);
byte[] buffer = new byte[1024];
int length;
while ((length = istream.read(buffer))>0){
ostream.write(buffer, 0, length);
ostream.flush();
}
istream.close();
ostream.close();
}
catch(Exception e){
e.printStackTrace();
try{
if(istream!=null)
istream.close();
if(ostream!=null) {
ostream.flush();
ostream.close();
}
}
结果执行到红色行时就出错了,跳转到catch中,查看数据库目录下,只有该名字的数据库存在,里面内容全部为空,后面当访问该数据库时,就会出错,因为复制没有成功,该有的字段都没有。
原因:开始获取绝对路径mContext.getDatabasePath时,其实并没有database目录,目录下也没有该文件,但是可以获取到路径,这是使用
ostream = new FileOutputStream(dbPath)就会出错,如果有目录,没有文件,系统默认函数执行并建立文件;如果没有目录也没有文件,就会不进行后面函数的操作,走到catch下,但是会建立文件(只建立文件,没有做后面的拷贝数据流操作)。
解决方法:方法一:在最开始增加一句mContext.openOrCreateDatabase(S_DBContext.ProvinceInfo.DATABASE_NAME, Context.MODE_PRIVATE, null);先建立数据库,这时就会创建database目录及文件,使得后面ostream = new FileOutputStream(dbPath);不会出错;
方法二:在执行ostream = new FileOutputStream(dbPath);之前,需要先创建目录:
File file = new File(dbPath);
Log.e("vicky", "file before : "+file.exists());
if (!file.exists()) {
File dirFile = Environment.getDataDirectory();
if (!dirFile.exists()) {
dirFile.mkdir();
}
file.createNewFile();
}
这样就不会再有崩溃的问题了。噢耶!!!
本文解决了在Android应用中从assets目录拷贝数据库到data/data目录下时遇到的崩溃问题。通过检查路径是否存在并手动创建目录,确保了数据库能够正确复制。

1601

被折叠的 条评论
为什么被折叠?



