對於我們所熟悉的大部分軟體都有一個比較典型的特點,應用現有的資料根據不同的需求來得到相應的結果。例如,我們最常用的Officeword、Excel、PowerPoint等辦公軟體,它們都是協助我們完成某種特定的需求,同時由其所產生的資料或者文檔又可以被其它軟體所讀取和做進一步的最佳化等等,在這個層面上可以看成是這些軟體通過相同的檔案標準來共用資料。但是對於Android最大的不同點在於,其平台上的應用軟體所儲存的資料或者檔案是私人,僅僅可以通過它自身才可以訪問其所包含的資料資源。
那麼基於這樣的限制,該如何在Android平台上實現不同程式間的資料共用呢?答案非常簡單 – 應用ContentProviders,這是建立在Android平台上用於定義統一的資料標準。Android提供了針對不同資料類型的ContentProviders來滿足各種需要。例如:Image、Audio、Video和通訊錄資訊類等。閱讀下邊的文檔之前,最好先熟悉Content Providers的概念。
有了上邊所提到Content Providers,接下來就要處理在共用檔案過程中的儲存環節了,這裡有四種方法分別適用於不同情況的需求。它們都各自有相應的優缺點,所以當開發人員決定選擇應用哪種方法之前,先要考慮當前所操作的情況是否適合於所選擇的方法。
- Preferences
- Files
- Databases
- Network
接下來將依次介紹上訴四個方法:
Preferences從其儲存資料的結構來分析,這是一個相對較輕量級的儲存資料的方法。類似於我們常用的ini檔案儲存軟體初始化設定,同樣在Android平台常用於儲存較簡單的參數設定。例如,可以通過它儲存上一次使用者所作的修改或者自訂參數設定,當再次啟動程式後依然保持原有的設定。通過Context.getSharedPreferences()方法來讀寫數值,這個方法通過設定name來使得同一個程式內的其它模組共用資料。如果不需要與其它模組共用資料,可以使用Activity.getPreferences()方法保持資料私人。需要著重強調一點,無法直接在多個程式間共用Preferences資料(不包括使用Content Providers)。
通過一個執行個體來瞭解實際使用方法:
01.import android.app.Activity;
02.import android.content.SharedPreferences;
03.
04.public class Calc extends Activity {
05.public static final String PREFS_NAME = "MyPrefsFile";
06. . . .
07.
08. @Override
09. protected void onCreate(Bundle state){
10. super.onCreate(state);
11.
12. . . .
13.
14. // Restore preferences
15. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
16. boolean silent = settings.getBoolean("silentMode", false);
17. setSilent(silent);
18. }
19.
20. @Override
21. protected void onStop(){
22. super.onStop();
23.
24. // Save user preferences. We need an Editor object to
25. // make changes. All objects are from android.context.Context
26. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
27. SharedPreferences.Editor editor = settings.edit();
28. editor.putBoolean("silentMode", mSilentMode);
29.
30. // Don't forget to commit your edits!!!
31. editor.commit();
32. }
33.}
Files從這是第二種方法,可以在裝置本身的存放裝置或者外接的存放裝置中建立用於儲存資料的檔案。同樣在預設的狀態下,檔案是不能在不同的程式間共用。
寫檔案:調用Context.openFileOutput()方法根據指定的路徑和檔案名稱來建立檔案,這個方法會返回一個FileOutputStream對象。
讀取檔案:調用Context.openFileInput()方法通過制定的路徑和檔案名稱來返回一個標準的Java FileInputStream對象。
(注意:在其它程式中將無法應用相同的路徑和檔案名稱來操作檔案)
另外編譯器之前,在res/raw/tempFile中建立一個static檔案,這樣可以在程式中通過Resources.openRawResource (R.raw.myDataFile)方法同樣返回一個InputStream對象,直接讀取檔案內容。
Databases在Android API中包括了應用SQLite databases的介面,每個程式所建立的資料庫都是私人的,換句話說,程式間無法相互訪問對方的資料庫。
在程式中建立SQLiteDatabase對象,其中包含了大部分與database互動的方法,例如:讀取資料或者管理當前資料。可以應用SQLiteDatabase和其subClassSQLiteOpenHelper的create()方法來建立新的資料庫。
對於SQLitedatabase而言,其強大和方便的功能為Android提供了強有力的儲存功能。特別是儲存一些複雜的資料結構,例如:Android特別為通訊錄建立了特有的資料類型,其中包含了非常多的子集而且涵蓋了大部分的資料類型 “First Name” “Last Name” “PhoneNumber”和“Photo”等。
Android可以通過Sqlite3 database tool來查看指定資料庫中表的內容,直接運行SQL命令來快速便捷的直接操作SQLite database,參考 Examine databases (sqlite3)瞭解更多內容。
資料庫在裝置中儲存的地址是 /data/data/package_name/databases
Network通過網路來擷取和儲存資料資源,這個方法需要裝置保持網路連接狀態,所以相對存在一些限制。下面列出了兩個用於相關操作的類:
以上是四種常用於針對Android平台來儲存和讀取資料的方法。
查看官方文檔