2010-12-15 64 views
76

我已經通過編程方式創建了一個sqlite數據庫,默認方式是擴展SQLiteOpenHelper並覆蓋onCreate()。這樣db就可以在需要時隨時創建。設備上的sqlite數據庫的位置

我想用sqlite瀏覽器檢查OS X機器上的db文件的內容。 我知道db文件的名稱,但是我在設備上找不到它。我已經通過USB連接到設備,並用finder和terminal查看,但我找不到數據庫文件。

什麼是Android設備上的SQLite數據庫的默認位置?

回答

10

/data/data/packagename/databases/

/data/data/com.example.program/databases/

81

你可以找到你創建的數據庫,在

//data/data/<Your-Application-Package-Name>/databases/<your-database-name> 

命名<your-database-name>

把它拉出來使用文件資源管理器並重新命名爲ŧ o .db3擴展名在SQLiteExplorer中使用它

使用DDMS的文件瀏覽器導航到模擬器目錄。

+1

當我在模擬器中嘗試時,我可以cd/data。但是當我嘗試使用連接的Galaxy Vibrant時,我無法切換到/數據。在這兩種情況下,adb服務器是否以不同的用途運行? – 2010-12-15 18:55:01

+37

您無權訪問真實手機上的/ data文件夾。它是'700'。您需要root權限才能看到它。 – Falmarri 2010-12-15 19:34:43

+9

以防萬一如果您想從應用程序**獲取路徑**,則爲context.getDatabasePath(「」)。事實上它返回上面的路徑。您可以訪問此路徑進行讀寫,但只能從創建數據庫的應用程序訪問。 – 2014-05-23 09:20:52

18

如果你正在談論真實設備/data/data/<application-package-name>是無法訪問。您必須擁有root權限...

+0

這不完全正確。它不是*可瀏覽的*,但是文件的*可訪問性取決於它們各自的權限位。 – 2014-05-27 18:12:04

+0

我的手機已經紮根。我怎樣才能「瀏覽」數據文件夾? – 2014-08-16 14:55:26

+0

@SreecharanDesabattula,您需要轉到adb shell並使用「su」命令切換到超級用戶來瀏覽目錄。 – 2014-09-20 23:29:53

8

SQLite數據庫只是一個文件。你可以把這個文件,移動它,甚至將它複製到另一個系統(例如,從你的手機到你的工作站),它會正常工作。 Android將該文件存儲在/data/data/packagename/databases/目錄中。您可以在Eclipse(Window > Show View > Other... > Android > File Explorer)中使用adb commandFile Explorer view來查看,移動或刪除它。

40

對於這一點,我所做的是

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" /> 

不是輝煌的方式,但作品。

+0

不錯。我正在尋找這個。也可以選擇將完整的數據庫上傳到服務器進行分析。 – Jeroen 2013-03-31 21:21:37

+3

如果它不工作...使用數據庫名稱「/data/data/your.app.package/databases/your_db」只需刪除擴展名「.db3」 – 2014-07-17 18:53:00

+1

此解決方案工作正常。但是,您可以使用getDatabasePath(your_db_name)來獲取File對象並使用getAbsolutePath()來獲取準確的路徑,而不是構建它。getDatabasePath方法在ContextWrapper中定義。 – Roy 2015-10-02 07:18:00

2

可以使用亞行外殼從上面的鏈接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;

這很簡單,但每次我需要它時,我都不知道 在哪裏找到它。

0

你也可以檢查你的IDE是否有像Eclipse的DDMS透視圖的實用程序,它允許你通過目錄中的文件瀏覽和/或複製,並從仿真器或紮根設備。

8

好吧,這可能會遲到,但它會有所幫助。 您可以通過亞行

訪問數據庫 沒有生根您的設備

使用CMD啓動亞行,然後鍵入以下命令

-run-as com.your.package 
[email protected]:/data/data/com.your.package $ ls 
cache 
databases 
lib 
shared_prefs 

現在,你可以從這裏打開。

+4

是的,對於調試APK。不,對於一個產品(或者在運行中的Android發行版被破壞)。 – 2014-05-27 18:12:34

15

這是老問題,但回答可能會幫助別人。

其中的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); 
    } 
} 
+0

我試過這個,並在'Logcat'中返回錯誤'無法打開數據庫'/ mnt/sdcard/itens'.' – underfilho 2018-02-15 14:48:07

+1

我很抱歉。這個答案是四歲。 OP比這更老(2010)。目前,Android與2010年有顯着不同。因此,數據庫位置可能處於另一個路徑。對不起,我無法對你有更多幫助。 – RandomUser 2018-02-19 07:50:35

+0

可能發生錯誤是因爲應用程序不允許寫入,因此無論如何 – underfilho 2018-02-22 13:56:50

0

定義你的數據庫名稱,如:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db"; 

而且你可以看到在你的數據庫:

storage/sdcard0/yourdatabasename.db 
0

如果您的應用程序創建一個數據庫,這個數據庫是默認保存在DATA/data/APP_NAME/databases/FILENAME.

上述目錄的部分是基於以下規則構建的目錄。 DATA是Environment.getDataDirectory()方法返回的路徑。 APP_NAME是您的應用程序名稱。 FILENAME是您在數據庫的應用程序代碼中指定的名稱。

4

如果你的名字你的數據庫是不給的路徑,然後最常見的方式來獲得它的文件夾中的文件是這樣的:

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 /」字符串,但在這種情況下不會。

20

上下文包含許多路徑功能: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打開數據庫自動生成。

2
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" /> 
0

公共類MySQLiteOpenHelper擴展SQLiteOpenHelper { MySQLiteOpenHelper(上下文的背景下){ 超(背景下, 「/mnt/sdcard/database_name.db」 ,null,0); }}

不要硬編碼「/ sdcard /」;使用Environment.getExternalStorageDirectory()。getPath()代替