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

原创 2016年06月02日 11:41:02

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HYZ数据库文件读写控件

  • 2006年03月16日 00:00
  • 164KB
  • 下载

QT sqlite3数据库读取、容器操作、文件读写——学习笔记。

直接上代码 #include "dbpoi.h" #include #include #include #include #include #include #include...
  • swqqcs
  • swqqcs
  • 2012年06月19日 21:04
  • 8592

Java I/O文件读写/删除/复制等

  • 2014年08月04日 15:41
  • 5KB
  • 下载

c#文件读写、创建、复制、移动、删除

//1.---------文件夹创建、移动、删除--------- //创建文件夹 Directory.CreateDirectory(Server.MapPath("a")); Direc...
  • lile010
  • lile010
  • 2014年09月18日 10:26
  • 236

Win8 Metro中文件读写删除与复制操作

Win8 Metro中文件读写删除与复制操作

VC++套接字、数据库、文件读写综合应用-客户端读取文件套接字接收服务端写入数据库

开发一个应用;套接字连接;客户端读取文件;服务端接收后;写入数据库;模拟某些真实环境; 一 首先实现套接字收发 效果如上;代码见下; 二 服务端添加数据库操作代码 界面如下; 三 客户端读取文件...

RandomAccessFile多线程下载、复制文件、超大文件读写

本文包含以下Demo: 1、常用方法测试; 2、在文件中间插入一段新的数据; 3、多线程下载文件; 4、多线程复制文件; 5、超大文件的读写。...

hdfs-文件读写测试

  • 2017年10月23日 14:12
  • 1.03MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库复制及文件读写的bug
举报原因:
原因补充:

(最多只允许输入30个字)