Android數據存儲(Data Storage)(一)

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的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *