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
- android数据库拷贝出错
- android拷贝数据库
- android中数据库的拷贝
- sqlite数据库文件拷贝出错
- Android Studio 拷贝使用外部数据库
- Android开发之数据库的拷贝
- Android 拷贝db文件到sqlite数据库。
- Android xUtils3.0 数据库操作出错
- Android xUtils3.0 数据库操作出错
- 拷贝数据库
- 数据库拷贝
- 数据库拷贝
- centOS使用scp拷贝出错.
- android 拷贝Sqlite数据库不成功,则出现空问题
- android:拷贝sqlite数据库到本地sd卡
- 解决Android 导出数据库出错: Failed to pull selection
- android出错
- Android 出错
- Android创建快捷方式,Phonegap创建快捷方式
- android学习笔记---fragment适配手机和平板
- hdu 4322 Candy 费用流
- 阿里巴巴面试过程及总结
- Cassandra与HBase的大数据对决 谁是胜者?
- android数据库拷贝出错
- 为CentOS 6 配置本地YUM源
- jQuery AJAX JSON Example – jQuery.parseJSON(), $.post() & $.getJSON()
- 10个核心的Linux面试问题与答案
- MongoDb 结果漂亮点!
- linux内核配置编译安装(X86)
- 2014-第九周项目一----<<,>>的运算符重载
- 编码社区推荐
- 实际数