Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Developers:存儲選項

Android Developers:存儲選項

編輯:關於Android編程

Android 為你提供了幾種保存持久應用程序數據方式。你所選擇的方法取決於你的特定需求,例如數據是否是你的應用程序私有的或者允許其他程序(和用戶)訪問,和你的數據需要多大的存儲空間。    你的數據存儲方式如下:  Shared Preference  以鍵值對的形式存儲簡單私有的數據。  Internal Storage  在設備的內存中存儲私有數據。  External Storage  在共享的外部存儲上存儲共有的數據。  SQLite Storage  在私有數據中存儲結構化數據。  Network Connection  在自己的網絡服務器的web上存儲數據。    Android為你提供了一種向其他的程序暴露你私有數據的方式---使用content provider。content provider是一個可選的組件,它暴露你的程序數據的讀寫權限,不受任何限制。關於更多使用content providerde的信息,請閱讀Content Providers文檔。    使用Shared Preferences  —————————————————————————————————————————————————————————————————— Android 為你提供了幾種保存持久應用程序數據方式。你所選擇的方法取決於你的特定需求,例如數據是否是你的應用程序私有的或者允許其他程序(和用戶)訪問,和你的數據需要多大的存儲空間。    你的數據存儲方式如下:  Shared Preference  以鍵值對的形式存儲簡單私有的數據。  Internal Storage  在設備的內存中存儲私有數據。  External Storage  在共享的外部存儲上存儲共有的數據。  SQLite Storage  在私有數據中存儲結構化數據。  Network Connection  在自己的網絡服務器的web上存儲數據。    Android為你提供了一種向其他的程序暴露你私有數據的方式---使用content provider。content provider是一個可選的組件,它暴露你的程序數據的讀寫權限,不受任何限制。關於更多使用content providerde的信息,請閱讀Content Providers文檔。    使用Shared Preferences  ———————————————————————————————————————————————————————————————————  SharedPreferences類提供了一個通用的框架,它允許你保存和獲取原始數據類型的持久化鍵值對。你可以使用SharedPreferences去保存任何原始數據:booleans,floats,ints,longs,和strings。這些數據將會跨越用戶會話保存(即使你的程序被殺死)。    你的程序為了獲取SharedPreferences對象,使用以下兩個方法中的任意一個:  getSharedPreferences() - 如果你需要多個preferences文件的時候就使用它。你使用第一個參數指定它們的名字來加以區分。  getPreferences() - 如果你僅僅需要一個preference文件的時候使用它,該文件與你的Activity關聯。因為這種方法僅僅有一個與你Activity關聯的preference文件,你不需要提供名字。    寫數據:       1.調用edit()獲取SharedPreferences.Editor對象。       2.使用例如putBoolean()和putString()等方法添加值。       3.使用commit()方法提交新的值。    讀數據,使用例如getBoolean()和getString()等SharedPreferences的方法。    用戶偏好:Shared preferences不僅僅保存“用戶偏好”,例如用戶選擇了什麼手機鈴聲。如果你對為你的應用程序創建用戶偏好感興趣,查閱PreferenceActivity,它為你提供了一個Activity框架,來創建用戶偏好,它將會自動存儲(使用Shared preferences)。    以下是一個實例,它在計算器中保存一個silent keypress模式的共享參數:  [java]    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.調用write()方法寫文件。       3.調用close()方法關閉文件流。           例如:  [java]   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.調用read()方法從文件中讀取字節。       3.調用close()方法關閉文件流。  提示:如果你想在程序編譯的時候保存一個靜態的文件,將它保存在你的項目res/raw/ 目錄下。你能調用openRawResource()方法打開它,傳入資源IDR.raw.<filename>為參數。這個方法返回一個InputStream對象,它可以使你能夠讀取文件[一般為音頻、視頻等文件、Html、APK文件等](但是你不能寫這個文件)。      保存緩存  如果你想緩存一些數據,而不是持久化存儲,你可以調用getCacheDir()方法打開一個File對象,它代表了你的應用程序存儲臨時緩存文件的內部路徑。當設備在內存空間稀缺的時候,Android可能會刪除這個緩存文件去回收存儲空間。然而,你不能依靠系統去為你清除這個文件。你應該常常自己維護這個文件,並且保持在一個合理的大小限制以內,例如1MB。當用戶卸載應用程序的時候,這個文件被移除。    別的有幫助的方法       getFileDir():獲取你的內部文件存儲的文件系統目錄的絕對路徑。       getDir():在你的內部存儲空間創建(或者打開一個已存在)的目錄。       deleteFile():刪除一個存儲在內部空間的文件。       fileList():返回你的應用程序當前存儲文件的數組。    使用外部存儲  ——————————————————————————————————————————————————————————————————  每個兼容Android的設備都支持一個共享“外部存儲”,你能使用它來保存文件。它可以是一個可移除的存儲媒介(例如一個SD卡)或者一個內在的(不可移除)存儲。當它們從USB大量存儲傳輸到電腦中的時候,存儲在外部存儲的文件都是任何人可讀的,並且可以被用戶修改。    一台設備使用部分內部存儲用於外部存儲是可能的,也會提供一個SD卡槽。如果這樣,SD卡不是外部存儲的一部分,並且你的應用部不能訪問它(系統無法檢測)(外部存儲被定義僅僅為用戶提供的系統掃描到的媒介)。    當心:如果用戶在一台電腦掛載或者移除媒介,外部存儲會變得不不可用,並且你存儲在外部存儲的文件沒有安全保障。所有的程序都能讀寫在外部存儲上的文件,並且用戶可以刪除它。    檢測媒介的可用性  在你使用外部存儲做任何工作之前,你必須調用getExternalStorageState()去檢查這個媒介是否可用。這麼媒介可能被掛載在一台電腦,丟失,只讀,或者在別的某種狀態。例如,以下是你如何檢查可用性的案例:  [java]    boolean mExternalStorageAvailable = false;     boolean mExternalStorageWriteable = false;     String state = Environment.getExternalStorageState();        if (Environment.MEDIA_MOUNTED.equals(state)) {        // We can read and write the media        mExternalStorageAvailable = mExternalStorageWriteable = true;    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {        // We can only read the media        mExternalStorageAvailable = true;        mExternalStorageWriteable = false;    } else {        // Something else is wrong. It may be one of many other states, but all we need        //  to know is we can neither read nor write        mExternalStorageAvailable = mExternalStorageWriteable = false;    }    這個案例是檢查外部存儲是否可以讀寫。getExternalStroageState()方法返回一個你檢測到的狀態,例如媒介是否共享(連接到一台電腦),完全丟失(已經移除)等。當你的應用程序需要訪問這個媒介的時候,你可以使用這些信息通知用戶。    訪問外部存儲的文件  如果你使用API Level 8以及以上的版本,使用getExternalFilesDir()去打開一個File對象,它代表了你存儲你的文件的外部存儲的路徑。這個方法使用一個類型參數,它指定了你想操作的子目錄的類型,例如DIRECTORY_MUSIC和DIRECTORY_RINGTONES(傳遞Null,則返回你的應用程序的文件目錄的根)。如果有必要,這個方法將創建一個合適的路徑。通過指定目錄的類型,你確保了Android的媒體掃描器在系統中能正確的將你的文件分類(例如,鈴聲被定義為鈴聲而不是音樂)。如果用戶卸載你的應用程序,該目錄和所有的內容將被刪除。    如果你使用API Level 7或者更低的版本,使用getExternalStorageDirectory(),去打開一個File對象,它代表了外部存儲的根目錄。那麼你將要把你的數據寫在如下目錄中:        /android/data/<package_name>/files/    <package_name>是你的java包名,例如”com.example.android.app”。如果這個設備正在運行的是API Level 8以及以上的版本,那麼他們卸載你的應用程序的時候,這個目錄以及所有的內容都將被刪除(API Level 8之前不會被刪除?)。    保存共享文件  如果你想保存文件,他們不僅僅特定於你的程序,並且當你的程序被卸載時不被刪除,將它們保存在外部存儲上的一個公共目錄中。這些目錄在放在外部存儲的根,例如Music/,Pictures/,Ringtones/,和其他。    如果你使用API Level7或更低的版本,使用getExternalStorageDirectory()方法獲取一個File對象,它代表了外部存儲的根,然後將你的共享文件存儲在以下的目錄之一:       Music/ -媒體掃描器將所有從這裡找到的文件視為音樂       Podcasts/ -媒體掃描器將所有從這裡找到文件視為播客       Ringtones/ -媒體掃描器將所有從這裡找到文件視為鈴聲       Alarms/ -媒體掃描器將所有從這裡找到文件視為警告       Notifications/ -媒體掃描器將所有從這裡的找到的文件視為通知鈴聲       Pictures/ -所有的照片(包括照相機拍攝的)       Movies/ -所有的電影(包括錄像機錄制的)       Download/ -其它的下載  對媒體掃描器隱藏你的文件  在你的外部文件目錄中包含一個被命名為.nomedia的空文件(注意在文件名中的點)。這將阻止Android的媒體掃描器讀取你的媒體文件,和在如Gallery或者Music的應用中包含它們。    保存緩存文件  如果你使用API Level 8或者更高的版本,使用getExternalCacheDir()打開一個File對象,它代表了你保存緩存文件的外部存儲的路徑。如果用戶卸載你的應用程序,這些文件將會被自動刪除。然而,在你的程序的生命周期,你應該管理這些緩存文件,並且為了維護文件空間,在它們不需要的時候刪除它們。         如果你使用API Level 7或者更低的版本,使用getExternalStroageDirectory()代開一個File對象,它代表了外部存儲的根目錄,然後你在這個目錄裡面寫你的緩存數據:       /Android/data/<package_name>/cache/  <package_name>是你的包名,如”com.example.android.app”。    使用數據庫  ——————————————————————————————————————————————————————————————————  Android為SQLite數據庫提供了完美的支持。任何你創建的數據庫都能被你程序中所有類通過名字訪問,但是不包括其他程序的類。    創建一個SQLite數據庫的推薦方法是創建一個SQLiteOpenHelper的子類,並且重寫onCreate()方法,你可以再這個方法裡執行一條SQLite命令去創建一個數據庫中的一個表。    例如:  [java]   public class DictionaryOpenHelper extends SQLiteOpenHelper {            private static final int DATABASE_VERSION = 2;        private static final String DICTIONARY_TABLE_NAME = "dictionary";        private static final String DICTIONARY_TABLE_CREATE =                    "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +                    KEY_WORD + " TEXT, " +                    KEY_DEFINITION + " TEXT);";            DictionaryOpenHelper(Context context) {            super(context, DATABASE_NAME, null, DATABASE_VERSION);        }            @Override        public void onCreate(SQLiteDatabase db) {            db.execSQL(DICTIONARY_TABLE_CREATE);        }    }    然後,你使用你定義的構造方法獲取一個你的SQLiteOpenHelper實例。分別調用getWritableDatabase()和getReadableDatabase()方法去從數據庫中進行讀和寫操作。 它們都返回一個SQLiteDatabase對象,它代表數據庫並且提供了操作數據庫的方法。    你可以使用SQLiteDatabase的query()方法執行數據庫的查詢操作,它接受各種各樣的查詢參數,例如表查詢,選擇查詢,行查詢,組查詢和其他。對於更復雜的查詢,例如需要列別名的查詢,你需要使用SQLiteQueryBuilder,它提供了幾個方便查詢的方法。         所有的SQLite查詢都返回一個Cursor,它查詢到的所有的行。Cursor是一種操縱機制,它負責操作你從數據庫查詢的結果,如讀取行和列。         查看Note Pad和Searchable Dictionary示例程序,它們演示了在Android中如實使用SQLite數據庫。    數據庫調試  Android SDK提供了包括sqlite3數據庫工具,它使你能夠浏覽表的內容,運行SQL命令,和運行在SQLite數據中其它重要的功能。查看Examining sqlite3 data frome shell去學習如何使用這個工具。    使用網絡連接  ———————————————————————————————————————————————————————————————————  你可以使用網絡(當它可用的時候)在自己的web服務器上存儲和獲取數據。執行網絡操作,使用下面包中的類:       java.net.*;       android.net.* 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved