Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)
在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卡的操作權限。對這個問題有以下幾種解決辦法:
Android 6.0 運行時權限處理?http://www.jianshu.com/p/b4a8b3d4f587
總結
以上是生活随笔為你收集整理的Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【信号与系统】笔记(4-2)拉普拉斯变换
- 下一篇: 【汇正财经】股票的发行价格是什么?