2009-07-30 100 views
29

有沒有辦法將android應用程序數據存儲在SD卡而不是內部存儲器中? 我知道如何將應用程序sqlite數據庫從內部存儲器傳輸到SDCard,但是如果內部存儲器首先被佔滿,該怎麼辦?每個人如何處理這個問題?在SD卡上存儲android應用程序數據

回答

9

警告:這個答案已經過時。您應該使用Environment.getExternalStorageDirectory()來獲取SD卡的根路徑,如下面的答案中所述。

老回答等等這有意義的評論:

添加/sdcard/到根的路徑應該將你的Android應用程序使用的SD卡(至少它的工作原理是這樣與G1)。 Android的文件系統對象使您能夠檢查文件大小......因此應該有可能(如果技巧)編寫一些故障轉移代碼。如果內部內存已滿,此代碼將調整根路徑。

+0

你是怎麼調整的根路徑? – user121196 2009-07-30 21:51:43

+0

調整您正在使用的根路徑。 (這有點令人困惑......你不能改變Android的根路徑) – haseman 2009-07-30 23:46:57

+0

我使用SQLiteDatabase來創建數據庫,但是它的構造函數的名稱參數不能包含路徑,我怎麼可能創建在SD卡上的數據庫? – user121196 2009-07-31 05:00:19

2

使用SDCard的問題在於,當您的應用程序需要它時,您無法可靠地認爲它將始終存在。內部存儲器並非如此。只要你的應用程序不依賴這個數據來運行它應該沒問題。

76

最好的做法是使用Environment.getExternalStorageDirectory()而不是硬代碼「/ sdcard」 這並不總是可以確定文件夾名稱會被調用。此外,Environment類還提供getExternalStorageState()方法來檢查外部存儲是否可用。

13

這是另一個整潔的小動作。 Application有許多被調用來獲取路徑的方法。 特別是,該應用程序具有方法getDatabasePath,由SQLiteOpenHelper使用來構建路徑。 自定義應用程序類可以覆蓋這些方法以提供不同的路徑,包括getExternalStorageDirectory中的路徑。

外部存儲器是特定應用程序或公共應用程序。 有許多方法,分別代替getExternalStorageDirectory機制, getExternalFilesDir()getExternalStoragePublicDirectory()

3

某些設備使用/ mnt/sdcard作爲根指向SD卡。

33

首先:

根據不同的型號/ OS,你可以訪問SD卡根目錄:

File externalStorage = Environment.getExternalStorageDirectory(); 

這將涉及內部SD存儲或內置SD記憶。

externalStorage.getAbsolutePath() 

將返回下列的值

「/ SD卡/」 或 「/ MNT/SD卡/」

要訪問外部SD存儲器或微型SD,即一個您通常從手機/平板電腦的外部插入,您必須使用android創建的以下文件夾之一指向外部存儲器:

"/mnt/sdcard/sd" 
"/mnt/sdcard/external_sd" 

"/sdcard/external_sd" 
"/sdcard/sd" 

"/mnt/sdcard/" 

PS:你可以看到在內部SD卡

存儲器的空文件夾external_sdsd,該文件夾是空的,其用於指向外部的微型SD卡。

最後請確保您具有android清單xml中SD卡android.permission.WRITE_EXTERNAL_STORAGE的讀取/寫入權限。

最後你必須指定文件名和您準備

private SQLiteDatabase DB = null; 

private static final String DATABASE_NAME = "MyDb.db"; 
//////////// 
File sdcard = Environment.getExternalStorageDirectory(); 

String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + DATABASE_NAME; 

DB = SQLiteDatabase.openDatabase(dbfile, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
/////////// 

和你準備好去...