关闭

数据库复制及文件读写的bug

标签: bugandroid studioPermission denied数据库
264人阅读 评论(1) 收藏 举报
分类:

这几天关于文件读写的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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14291次
    • 积分:402
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    最新评论