android数据库拷贝出错

来源:互联网 发布:用友erpu8软件介绍 编辑:程序博客网 时间:2024/06/05 08:09
今天测试项目,需要将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();
            }
这样就不会再有崩溃的问题了。噢耶!!!

http://qiangwei27.blog.163.com/blog/static/448990532013101473422963/
0 0