数据库复制及文件读写的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);
	}

以后得牢记呀,目录最好一级一级添加,步子得一步一步迈,否则扯着蛋啊!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值