数据库复制及文件读写的bug
这几天关于文件读写的bug弄得头疼,,,,,,,,明明写的东西在eclipse上面运行的好好的,开始使用Android Studio写,同样的格式就出现了bug!!!!!
private CityDB openCityDB(){ //文件路径 String path = "/data" + Environment.getDataDirectory().getAbsolutePath() + File.separator + "com.kai.temperature" + File.separator + CityDB.CITY_DB_NAME; File db = new File(path); if (!db.exists()||getSharePreferenceUtil().getVersion() < 0) { L.i("db is not exists"); try { //获取Assets文件 InputStream is = getAssets().open(CityDB.CITY_DB_NAME); FileOutputStream fos = new FileOutputStream(db); int len = -1; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); fos.flush(); } fos.close(); is.close(); getSharePreferenceUtil().setVersion(1);// 用于管理数据库版本,如果数据库有重大更新时使用 } catch (IOException e) { e.printStackTrace(); T.showLong(mApplication, e.getMessage()); L.e("kai", e.getMessage()); System.exit(0); } } return new CityDB(this, path); }上面这段代码就是获取assets文件下的city.db然后通过文件FileOutputStream写入文件。
在eclipse可以正常运行,但是在Android Studio下面,就会报出
/data/data/com.kai.temperature/city.db: open failed: ENOENT (No such file or directory)
纳尼,找不到文件!!!!
而且有时候还是 06-02 11:27:46.170 3637-3637/? I/kai: /data/data/com.kai.temperature/city.db: open failed: EACCES (Permission denied)
What the fuck !!! 权限这种东西我当然早就加了,那为什么会找不到文件?或者是权限没有加呢?
我们先说说这里的读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
那么肯定是我们的写法有问题啊。
我觉得这可能Android Studio太严格了,这种写法会出bug,比如Android Studio下关于.9.png严格的审查机制。
在翻阅了大量博客,还有StackOverFlow网站,我看出来了。
我觉得这里可能的问题就是:
1.文件权限没有加(可是我是真的真的加了)
2.文件路径不对,文件路径越级添加,比如:你想直接在A文件目录下添加B文件,可是A文件是不存在的,所以你得一级一级来添加。
3.不知道了。
按照这个想法,我重新改了一下代码。果然问题就解决了,可是又出现了新的bug, Oh my god ........
这是我改后的代码,后面的bug下次在总结吧。
private CityDB openCityDB(){ //创建一级文件目录 String cachePath="/data" + Environment.getDataDirectory().getAbsolutePath() + File.separator+"com.kai.temperature"; File cacheFile=new File(cachePath);//创建文件路径 cacheFile.mkdir(); //创建复制数据库的目录 File db=new File(cacheFile,CityDB.CITY_DB_NAME); String path=cachePath+File.separator + CityDB.CITY_DB_NAME; if(!db.exists() || getSharePreferenceUtil().getVersion()<0){ L.i("db is not exists!!!!"); try { InputStream is = getAssets().open(CityDB.CITY_DB_NAME); FileOutputStream fos=new FileOutputStream(db); int len=-1; byte[] buffer=new byte[1024]; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); fos.flush(); } fos.close(); is.close(); getSharePreferenceUtil().setVersion(1); }catch (IOException e){ L.e("kai",e.getMessage()); e.printStackTrace(); System.exit(0); } } return new CityDB(this,path); }
以后得牢记呀,目录最好一级一级添加,步子得一步一步迈,否则扯着蛋啊!!!!!!