我已經通過編程方式創建了一個sqlite數據庫,默認方式是擴展SQLiteOpenHelper
並覆蓋onCreate()
。這樣db就可以在需要時隨時創建。設備上的sqlite數據庫的位置
我想用sqlite瀏覽器檢查OS X機器上的db文件的內容。 我知道db文件的名稱,但是我在設備上找不到它。我已經通過USB連接到設備,並用finder和terminal查看,但我找不到數據庫文件。
什麼是Android設備上的SQLite數據庫的默認位置?
我已經通過編程方式創建了一個sqlite數據庫,默認方式是擴展SQLiteOpenHelper
並覆蓋onCreate()
。這樣db就可以在需要時隨時創建。設備上的sqlite數據庫的位置
我想用sqlite瀏覽器檢查OS X機器上的db文件的內容。 我知道db文件的名稱,但是我在設備上找不到它。我已經通過USB連接到設備,並用finder和terminal查看,但我找不到數據庫文件。
什麼是Android設備上的SQLite數據庫的默認位置?
/data/data/packagename/databases/
即
/data/data/com.example.program/databases/
你可以找到你創建的數據庫,在
//data/data/<Your-Application-Package-Name>/databases/<your-database-name>
命名<your-database-name>
把它拉出來使用文件資源管理器並重新命名爲ŧ o .db3擴展名在SQLiteExplorer中使用它
使用DDMS的文件瀏覽器導航到模擬器目錄。
如果你正在談論真實設備/data/data/<application-package-name>
是無法訪問。您必須擁有root權限...
這不完全正確。它不是*可瀏覽的*,但是文件的*可訪問性取決於它們各自的權限位。 – 2014-05-27 18:12:04
我的手機已經紮根。我怎樣才能「瀏覽」數據文件夾? – 2014-08-16 14:55:26
@SreecharanDesabattula,您需要轉到adb shell並使用「su」命令切換到超級用戶來瀏覽目錄。 – 2014-09-20 23:29:53
SQLite數據庫只是一個文件。你可以把這個文件,移動它,甚至將它複製到另一個系統(例如,從你的手機到你的工作站),它會正常工作。 Android將該文件存儲在/data/data/packagename/databases/
目錄中。您可以在Eclipse(Window > Show View > Other... > Android > File Explorer
)中使用adb command
或File Explorer view
來查看,移動或刪除它。
對於這一點,我所做的是
File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;
try
{
fis=new FileInputStream(f);
fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
while(true)
{
int i=fis.read();
if(i!=-1)
{fos.write(i);}
else
{break;}
}
fos.flush();
Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
e.printStackTrace();
Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
try
{
fos.close();
fis.close();
}
catch(IOException ioe)
{}
}
而要做到這一點,您的應用程序必須有權限訪問SD卡,添加以下設置到您的manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
不是輝煌的方式,但作品。
不錯。我正在尋找這個。也可以選擇將完整的數據庫上傳到服務器進行分析。 – Jeroen 2013-03-31 21:21:37
如果它不工作...使用數據庫名稱「/data/data/your.app.package/databases/your_db」只需刪除擴展名「.db3」 – 2014-07-17 18:53:00
此解決方案工作正常。但是,您可以使用getDatabasePath(your_db_name)來獲取File對象並使用getAbsolutePath()來獲取準確的路徑,而不是構建它。getDatabasePath方法在ContextWrapper中定義。 – Roy 2015-10-02 07:18:00
可以使用亞行外殼從上面的鏈接how-to
內容訪問:
教程:如何通過使用命令行來訪問的Android數據庫。 當您開始處理程序中的數據庫時,它確實是 重要且有用的,可以直接在程序外部訪問它,以檢查程序剛完成的工作和調試。
而且它在Android上也很重要。
這裏是如何做到這一點:
1)啓動模擬器(或你的真實設備連接到您的電腦)。我通常會從Eclipse中爲此啓動我的一個程序。 2)在android工具目錄中啓動一個 命令提示符。 3)鍵入adb shell。這個 將在您的仿真器/連接設備上啓動一個unix shell。 4)去 到您的數據庫所在的目錄:cd data/data這裏您有 設備上所有應用程序的列表進入您的應用程序 目錄(請注意,Unix區分大小寫!!)cd com.alocaly .LetterGame並下載到您的數據庫目錄中:cd 數據庫在這裏您可以找到所有數據庫。在我的情況下,只有一個(現在): :SCORE_DB 5)在你想要的數據庫上啓動sqlite 來檢查/更改:sqlite3 SCORE_DB從這裏,你可以檢查什麼 表存在:.tables 6)輸入任何SQL你想要的指令: select * from Score;
這很簡單,但每次我需要它時,我都不知道 在哪裏找到它。
你也可以檢查你的IDE是否有像Eclipse的DDMS透視圖的實用程序,它允許你通過目錄中的文件瀏覽和/或複製,並從仿真器或紮根設備。
好吧,這可能會遲到,但它會有所幫助。 您可以通過亞行
訪問數據庫 沒有生根您的設備使用CMD啓動亞行,然後鍵入以下命令
-run-as com.your.package
[email protected]:/data/data/com.your.package $ ls
cache
databases
lib
shared_prefs
現在,你可以從這裏打開。
是的,對於調試APK。不,對於一個產品(或者在運行中的Android發行版被破壞)。 – 2014-05-27 18:12:34
這是老問題,但回答可能會幫助別人。
其中的Android保存數據庫默認路徑不能在無根設備來accesed。所以,最簡單的方法來訪問數據庫文件(僅用於調試環境)是修改類的構造函數:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
MySQLiteOpenHelper(Context context) {
super(context, "/mnt/sdcard/database_name.db", null, 0);
}
}
記住這些線路更改生產環境:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
MySQLiteOpenHelper(Context context) {
super(context, "database_name.db", null, 0);
}
}
我試過這個,並在'Logcat'中返回錯誤'無法打開數據庫'/ mnt/sdcard/itens'.' – underfilho 2018-02-15 14:48:07
我很抱歉。這個答案是四歲。 OP比這更老(2010)。目前,Android與2010年有顯着不同。因此,數據庫位置可能處於另一個路徑。對不起,我無法對你有更多幫助。 – RandomUser 2018-02-19 07:50:35
可能發生錯誤是因爲應用程序不允許寫入,因此無論如何 – underfilho 2018-02-22 13:56:50
定義你的數據庫名稱,如:
private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";
而且你可以看到在你的數據庫:
storage/sdcard0/yourdatabasename.db
如果您的應用程序創建一個數據庫,這個數據庫是默認保存在DATA/data/APP_NAME/databases/FILENAME.
上述目錄的部分是基於以下規則構建的目錄。 DATA是Environment.getDataDirectory()方法返回的路徑。 APP_NAME是您的應用程序名稱。 FILENAME是您在數據庫的應用程序代碼中指定的名稱。
如果你的名字你的數據庫是不給的路徑,然後最常見的方式來獲得它的文件夾中的文件是這樣的:
final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);
其中DBAdapter.DATABASE_NAME
只是一個String
像「mydatabase.db」。 Context.getFilesDir()
返回應用文件的路徑,如:/data/data/<your.app.packagename>/files/
這就是爲什麼你需要.getParent()+"/databases/"
,刪除「文件」,並添加「數據庫」。
BTW Eclipse會警告你硬編碼的「data/data /」字符串,但在這種情況下不會。
上下文包含許多路徑功能:Context.getXXXPath()
其中之一是android.content.Context.getDatabasePath(字符串DBNAME)返回一個數據庫名爲dbname的絕對路徑。
Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);
返回的路徑,在這種情況下,會是這樣的:
/data/data/com.me.myapp/databases/mydb.db
請注意,此路徑,如果使用SQLiteOpenHelper打開數據庫自動生成。
By Default it stores to:
String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;
Where:
String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";
並檢查您的數據庫是否存儲到設備存儲。如果是這樣,你必須的Manifest.xml使用權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
公共類MySQLiteOpenHelper擴展SQLiteOpenHelper { MySQLiteOpenHelper(上下文的背景下){ 超(背景下, 「/mnt/sdcard/database_name.db」 ,null,0); }}
不要硬編碼「/ sdcard /」;使用Environment.getExternalStorageDirectory()。getPath()代替
當我在模擬器中嘗試時,我可以cd/data。但是當我嘗試使用連接的Galaxy Vibrant時,我無法切換到/數據。在這兩種情況下,adb服務器是否以不同的用途運行? – 2010-12-15 18:55:01
您無權訪問真實手機上的/ data文件夾。它是'700'。您需要root權限才能看到它。 – Falmarri 2010-12-15 19:34:43
以防萬一如果您想從應用程序**獲取路徑**,則爲context.getDatabasePath(「」)。事實上它返回上面的路徑。您可以訪問此路徑進行讀寫,但只能從創建數據庫的應用程序訪問。 –
2014-05-23 09:20:52