數據存儲Data Storage
概覽Storage quickvIEw
² 系統偏好:快速,輕量級存儲
² 文件:存儲到設備內部或可移動閃存
² 數據庫:任意的結構化存儲
² 支持基於網絡的存儲
無論你是否想把應用程序數據輸出給別人,你總需要有一個方法來保存它。android提供了下面4種機制來保存和獲取數據:系統偏好Preferences,文件Files,數據庫Databases和網絡Network。
系統偏好Preferences
系統偏好是一個用來存放和提取元數據類型鍵-值對的輕量級機制。它通常用來存放應用程序偏好,例如一個應用程序啟動時所使用的默認問候或文本字體。通過調用Context.getSharedPreferences() 來讀寫數值。如果你想分享給應用程序中的其它組件,可以為你的偏好集分配一個名字,或者使用沒有名字的Activity.getPreferences()方法來保持對於該調用程序的私有性。你不能跨應用程序共享偏好(除了使用一個內容提供器)。
下面是一個為計算器設置按鍵靜音模式的例子:
Java代碼:
- import android.app.Activity;
- import android.content.SharedPreferences;
- public class Calc extends Activity {
- public static final String PREFS_NAME = "MyPrefsFile";
- @Override
- protected void onCreate(Bundle state){
- super.onCreate(state);
- SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
- boolean silent = settings.getBoolean("silentMode", false);
- setSilent(silent);
- }
- @Override
- protected void onStop(){
- super.onStop();
- SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
- SharedPreferences.Editor editor = settings.edit();
- editor.putBoolean("silentMode", mSilentMode);
- editor.commit();
- }
- }
文件Files你可以直接在移動設備或可移動存儲媒介裡存放文件。缺省情況下,其它應用程序不能訪問這些文件。
為了從文件中讀取數據,可調用Context.openFileInput()方法並傳遞本地文件名和文件路徑給它。該方法返回一個標准的Java FileInputStream 對象。為了寫一個文件,可調用Context.openFileOutput()並傳遞文件名和路徑,這個方法也返回FileOutputStream對象。從另外的應用程序中調用這些方法將不起作用,你只能訪問本地文件。
如果你有一個靜態文件需要在編譯時打包進應用程序,你可以保存該文件在你項目中res/raw/myDataFile,然後使用Resources.openRawResource (R.raw.myDataFile)打開它。該方法返回一個InputStream對象,你可以使用它讀取文件數據。
數據庫Databasesandroid API包含對創建和使用SQLite數據庫的支持。每個數據庫都是創建它的應用程序所私有的。
這個SQLiteDatabase對象代表了一個數據庫並包含與之交互的方法-生成查詢和管理數據。為了創建數據庫,調用SQLiteDatabase.create()並同時子類化SQLiteOpenHelper。
作為支持SQLite數據庫的一部分,android暴露了數據庫管理函數,這讓你可以存儲復雜的數據集合,這些數據被包裝到有用的對象裡。比如,android為聯系人信息定義了一個數據類型;它由很多字段組成,其中包括姓,名(字符串),地址信息和電話號碼(也是字符串),照片(位圖圖像),以及更多其它個人信息。
android裝載了sqlite3數據工具, 利用這些工具你可以浏覽表內容,運行SQL命令,並執行SQLite數據庫上的其它有用的函數。請查閱檢查數據庫(Examine databases (sqlite3))得知如何運行這個程序。
所有的數據庫,SQLite以及其它,都被保存在設備如下目錄裡:/data/data/package_name/databases.
討論創建多少表格,包含哪些字段以及它們之間如何連接超出了本文的范圍,不過android並沒有引入任何在標准SQLite概念之外的限制。我們確實推薦包含一個自增長數值的關鍵域,作為一個唯一ID用來快速查找一個記錄。這對於私有數據並不必要,但如果你實現了一個內容提供器,你必須包含這樣一個唯一ID字段。請參見Content Providers文檔以獲取關於該字段的更多信息,以及NotePadProvider類(在NotePad例子代碼裡)中創建和組裝一個新數據庫的方法。你創建的任何數據庫都將可以通過名字被應用程序中其它的類訪問,但不能從應用程序外部訪問。
網絡Network你也可以使用網絡來存放和獲取數據(當它可用時)。要進行網絡操作,可使用如下程序包中的類:
· Java.Net.*
· android.