Android提供幾種儲存持久化應用程式資料的選擇。依賴具體的需求來選擇解決適合的方案,如資料應該是應用程式私人的還是共用的,以及資料所需要的儲存空間等。
以下是可選擇的資料存放區方案:
共用偏好(Shared Preferences)
用鍵---值對的形式儲存私人的未經處理資料。
內部儲存(Internal Storage)
在裝置的記憶體上儲存私人的資料。
外部儲存(External Storage)
在共用的外部儲存空間上儲存公用的資料。
SQLite資料庫
在私人的資料庫中儲存結構化的資料。
網路連接(Network Connection)
把資料儲存在自己的互連網伺服器上。
Android提供了內容提供器(content provider),能夠你的私人資料公開給其他應用程式。內容提供器是一種公開應用程式資料的讀寫存取權限的可選組件,這種讀寫訪問會受到你所施加的任何限制的影響。
使用共用偏好
SharedPreference類提供了一個一般性的架構,它允許用原始類型資料的鍵---值對的形式來儲存和擷取持久化的資料。使用SharedPreference能夠儲存任意類型的原始類型資料:布爾型、浮點型、整數型、以及字串。這種資料會跨越使用者的會話周期被持久化儲存(即使是應用程式進程被殺死)。
有兩種方法來為應用程式擷取SharedPreferences對象:
1. getSharedPreferences()方法---如果需要多個用名稱來標識的偏好檔案,就要使用這個方法,它的第一個參數要指定偏好檔案的名稱。
2. getPreferences()方法---如果僅需要針對Activity的一個偏好檔案,就使用這個方法。因為這個方法僅返回當前Activity的偏好檔案,不需要提供偏好檔案的名稱。
以下是向偏好檔案中寫入資料的方法:
1. 調用edit()方法來擷取一個SharedPreferences.Editor對象;
2. 調用諸如putBoolean()和putString()等方法來添加要儲存的值;
3. 調用commit()方法來提交要儲存的新值。
使用SharedPreferences對象的諸如getBoolean()和getString()等方法來讀取被儲存的值。
以下範例程式碼儲存了計算機的靜音按鍵模式偏好:
public
class Calc
extends Activity
{
public
static final
String PREFS_NAME
= "MyPrefsFile";
@Override
protected
void onCreate(Bundle state){
super.onCreate(state);
.
. .
// Restore preferences
SharedPreferences settings
= getSharedPreferences(PREFS_NAME,
0);
boolean silent
= settings.getBoolean("silentMode",
false);
setSilent(silent);
}
@Override
protected
void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings
= getSharedPreferences(PREFS_NAME,
0);
SharedPreferences.Editor editor
= settings.edit();
editor.putBoolean("silentMode",
mSilentMode);
// Commit the edits!
editor.commit();
}
}
使用內部儲存
能夠把檔案直接儲存在裝置的內部儲存空間上,預設情況下,儲存在內部儲存空間上的檔案是應用程式的私人資料,其他應用程式(或使用者)不能夠訪問它們。當使用者卸載應用程式時,這些檔案也會被刪除。
以下是在內部儲存空間中建立並寫入一個私人檔案的方法:
1. 調用openFileOutput方法,這個方法需要指定檔案的名稱和操作模式。它會返回一個FileOutputStream對象。
2. 用FileOutputStream對象的write()方法把資料寫入檔案;
3. 用FileOutputStream對象的close()方法關閉輸出資料流。
例如:
String FILENAME
= "hello_file";
String
string =
"hello world!";
FileOutputStream fos
= openFileOutput(FILENAME,
Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
MODE_PRIVATE參數指示要建立這個檔案(或者,如果有同名檔案存在,則會替換舊檔案),並且讓這個檔案是應用程式的私人檔案。其他可用的模式包括:MODE_APPEND、MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。
以下是從內部儲存中讀取一個檔案的方法:
1.
調用openFileInput()方法,把要讀取的檔案名稱傳遞給這個方法。這個方法會返回一個FileInputStream對象。
2.
用FileInputStream對象的read()方法從檔案中讀取位元組。
3. 用FileInputStream對象的close()方法關閉輸入資料流。
提示:如果在編譯時間要把一個靜態檔案儲存到應用程式中,那麼要把這個檔案儲存在工程的res/raw/目錄中。能夠用openRawResource()方法開啟這個檔案,這個方法需要把R.raw.<filename>的資源ID傳遞給它。這個方法會返回一個用於讀取檔案的InputStream對象(但是,不能對這個檔案進行寫入的操作)。
儲存快取檔案
如果只是要緩衝一些資料,而不是要持久的儲存它,那麼應該使用getCacheDir()方法來開啟一個File對象,它代表了應用程式要儲存臨時快取檔案的內部目錄。
當裝置的內部儲存空間不足的時候,Android可能會刪除這些快取檔案來回收儲存空間。但是,不應該依賴系統來給你清理這些檔案,應該始終自己來維護快取檔案,並且要把儲存空間的耗費限定在合理的範圍內,如1MB。當使用者卸載應用程式時,這些檔案會被刪除。
其他有用的方法
getFileDir()
擷取內部檔案被儲存的檔案系統目錄的絕對路徑。
getDir()
在內部儲存空間中建立(或開啟既存的)目錄。
deleteFile()
刪除儲存在內部儲存空間上的檔案。
fileList()
返回應用程式當前儲存的檔案數組列表。