日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2024/1/18 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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卡的操作權限。對這個問題有以下幾種解決辦法:

  • 打開虛擬機的Setting–>Apps–>找到你的應用–>點擊Permissions–>將需要的權限手動打開
  • 將targetSdkVersion設置為小于23,然后重新編譯
  • 手動在activity添加請求權限的代碼,具體代碼可參考如下鏈接:?
    Android 6.0 運行時權限處理?http://www.jianshu.com/p/b4a8b3d4f587
  • 總結

    以上是生活随笔為你收集整理的Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。