在android中我们常用sqlite数据库来存放文件,在开发中我们可能需要查看数据库中的所有的数据,以保证数据的准确性。在已经root的手机下,我们可以进入

data/data/包名/databases/数据库名称

目录下获取数据库文件,可以在ddms界面导出,用Navicat等软件查看编辑修改。
但如果手机没有root,我们用ddms是打不开/data/data目录的。那如何获取相应的db文件呢?

解决方法:

我们可以利用文件拷贝的方法,在app内置一个数据库备份与恢复功能,即实现从内部到外部的文件复制进出功能即可实现内部数据库的交换。该方法支持所有安卓版本。包括最新的安卓13

代码如下:

    String dbFileName= Environment.getDataDirectory().getAbsolutePath() + "/data/" + getPackageName() + "/databases/mydatabase.db";//getExternalFilesDir(null);这个目录会在应用被卸载的时候删除,而且访问这个目录不需要动态申请STORAGE权限。如果这个目录不存在,系统会自动帮你创建String dbBakFile= getExternalFilesDir(null) + "/copy.db";public void btnBackClick(View v) {//找到文件的路径///data/data/包名/databases/数据库名称File dbFile = new File(dbFileName);FileInputStream fis = null;FileOutputStream fos = null;try {//文件复制到sd卡中fis = new FileInputStream(dbFile);//fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/copy.db");fos=new FileOutputStream(dbBakFile);int len;byte[] buffer = new byte[2048];while (-1 != (len = fis.read(buffer))) {fos.write(buffer, 0, len);}fos.flush();} catch (Exception e) {e.printStackTrace();} finally {//关闭数据流try {if (fos != null) fos.close();if (fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}}Toast.makeText(MainActivity.this,"SQLite数据库备份成功,备份路径:\n"+dbBakFile, Toast.LENGTH_SHORT).show();}public void btnRestoreClick(View v) {/*找到备份文件的路径/storage/emulated/0/Android/data/yourPackageName/files*/File dbFile = new File(dbBakFile);FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(dbFile);//将备份文件复制到 data/data/包名/databases/数据库名称fos=new FileOutputStream(dbFileName);int len;byte[] buffer = new byte[2048];while (-1 != (len = fis.read(buffer))) {fos.write(buffer, 0, len);}fos.flush();} catch (Exception e) {e.printStackTrace();} finally {//关闭数据流try {if (fos != null) fos.close();if (fis != null) fis.close();} catch (IOException e) {e.printStackTrace();}}Toast.makeText(MainActivity.this,"SQLite数据库从备份恢复成功", Toast.LENGTH_SHORT).show();}

需要申请文件系统读写权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

说明:如果想把备份文件写入公共目录,比如

/storage/emulated/0/Download 

对这种目录的读写需要特殊的动态权限申请操作(安卓6.0+)

否则会报下面这个错误:

/storage/emulated/0/Download/copy_download.db (Permission denied)

解决方法:

在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错:

其实这个问题是由于Android6.0更新了权限机制,在6.0之前,写入sd卡权限只需在清单文件中添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>即可,而在6.0中,则需要在activity中用代码来请求一些敏感的权限,其中就包括对sd卡的操作权限。对这个问题有以下几种解决办法:

  1. 打开虚拟机的Setting–>Apps–>找到你的应用–>点击Permissions–>将需要的权限手动打开
  2. 将targetSdkVersion设置为小于23,然后重新编译
  3. 手动在activity添加请求权限的代码,具体代码可参考如下链接: 
    Android 6.0 运行时权限处理 http://www.jianshu.com/p/b4a8b3d4f587

Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)相关推荐

  1. android 未root手机获取应用的sqlite数据库

    在android中我们常用sqlite数据库来存放文件,在开发中我们可能需要查看所有的数据,以保证数据的准确性.在已经root的手机下,我们可以进入/data/data/包名/databases目录下 ...

  2. android模拟器玩手游,手游模拟器使用说明 手游在电脑上玩的方法介绍

    手游模拟器使用说明 手游在电脑上玩的方法介绍 2018-06-05 16:33:31来源:游戏下载编辑:评论(0) 随着移动互联网的不断发展,人们时间愈加聚焦于移动互联设备工具,移动手机端各种应用逐年 ...

  3. php 内容写入文件内容_PHP使用内置函数file_put_contents写入文件及追加内容的方法...

    本文实例讲述了PHP使用内置函数file_put_contents写入文件及追加内容的方法.分享给大家供大家参考,具体如下: 以追加形式写入内容 当设置 flags 参数值为 FILE_APPEND ...

  4. 未root手机 ida动态调试安卓so文件—— 学习实践 《教我兄弟学Android逆向09 IDA动态破解登陆验证》

    参考: https://www.52pojie.cn/thread-742686-1-1.html https://www.pianshen.com/article/6759779793 本文基本为h ...

  5. Android之非root手机run-as命令获取debug版本apk里面的数据(shared_prefs文件,lib下面的so,数据库文件)

    1  问题 非root手机想要获取debug版本的apk里面的数据(shared_prefs文件,lib下面的so,数据库文件) 2  直接用run-as命令 adb shellrun-as pack ...

  6. 小米手机安全卸载内置应用

    手机端准备 首先打开设置,在我的设备中选择全部参数,连续按MIUI版本,直到显示进入开发者模式,然后在更多设置中找到开发者选项.将手机连接电脑,并打开USB调试选项,如果提示配对选择允许. 版本不同, ...

  7. android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...

    直接上重点: 1:获取内置SD卡的路径, 但是判断是否有效(是否挂载), 需要用到下面检测挂载点的方法 /** * 获取内置SD卡路径 * * @return */ public String get ...

  8. 你的Android手机能投屏到电脑上吗?方法我都给你列出来了

    共享屏幕正在一步一步的进入到我们的生活中,从最原始的手机-电视屏幕共享到现在的手机-电脑屏幕共享,这一规模正在逐步的扩散至全球的各个角落中,随之的手机型号的不同,从symbian-Windows ph ...

  9. android nand 空间,2020年主流智能手机,内置NAND闪存平均容量100GB

    原标题:2020年主流智能手机,内置NAND闪存平均容量100GB NAND闪存容量已成为消费者购买新智能手机时最重要的考虑因素之一.摄像头.应用处理器(AP)和显示器的进步刺激了视频.图像和其他多媒 ...

最新文章

  1. 为什么科研总会走弯路【转】
  2. SQL中的sysobjects与syscolumns
  3. java 消息机制 ActiveMQ入门实例
  4. linux 环境搭建
  5. 安装CentOS 7 遇到的坑
  6. kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程
  7. TCMalloc:线程缓存Malloc以及tcmalloc与ptmalloc性能对比
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的病例管理系统
  9. dlut-KFQ概率上机1
  10. iOS开发-OC语言 (七)继承、多态、类别
  11. Android开发框架整理
  12. C语言开发简单的学生成绩管理系统(附源码)
  13. Shiro面试题答案
  14. opensips搭配rtpengine实现sip信令和rtp流的代理
  15. ×××全功能邮件系统(3)
  16. 学习笔记(三)数据预处理之数据清理
  17. 《项目》 之 ESP8266 心知天气 + 时钟 + WS2812点阵屏 + B站粉丝计数
  18. 京东页面html前台代码,京东页面代码
  19. 谁说EMC、IBM不能替换,还你一个存储虚拟化的真相!
  20. 8/11 Perl和Postgresql联合在京交流会 Perl6项目经理远道参加

热门文章

  1. EAGLE模拟数据中提取大量星系数据的一些方法
  2. 区块链研究生专业_华东交通大学信息工程学院江西应用科技学院软件与区块链学院帮扶合作签约成功...
  3. numpy 学习汇总33 - 索引切片( 初步学习 tcy)
  4. 中科大发4万封钓鱼邮件给师生“免费送月饼”,网友:学校太会“整活”了......
  5. 圣诞快乐java代码,java版的下雪,大家圣诞快乐
  6. Rust引入外部包,VsCode引入失败,Blocking waiting for file lock on package cache lock
  7. JAVA中OOA、OOD、OOP概念
  8. 2021年T电梯修理考试及T电梯修理模拟试题
  9. 通过kvm创建qcow2格式的镜像文件
  10. DM8168硬件平台的简介