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();
}
}
使用內部存儲 www.aiwalls.com
能夠把文件直接保存在設備的內部存儲器上,默認情況下,保存在內部存儲器上的文件是應用程序的私有數據,其他應用程序(或用戶)不能夠訪問它們。當用戶卸載應用程序時,這些文件也會被刪除。
以下是在內部存儲器中創建並寫入一個私有文件的方法:
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()
返回應用程序當前保存的文件數組列表。
摘自 FireOfStar的專欄