Android應用開發中,給咱們提供了5種數據的存儲方式1 使用SharedPreferences存儲數據2 文件存儲數據3 SQLite數據庫存儲數據4 使用ContentProvider存儲數據5 網絡存儲數據不一樣的業務邏輯,或者需求,用不一樣的實現方式如下是這幾中數據存儲方式的說明用及法,第一種: 使用SharedPreferences存儲數據SharedPreferences是Android平臺上一個輕量級的存儲類,主要是保存一些經常使用的配置好比窗口狀態,通常在Activity中 重載窗口狀態onSaveInstanceState保存通常使用SharedPreferences完成,它提供了Android平臺常規的Long長 整形、Int整形、String字符串型的保存。 它是什麼樣的處理方式呢? SharedPreferences相似過去Windows系統上的ini配置文件,可是它分爲多種權限,能夠全局共享訪問,android123提示最終是以xml方式來保存,總體效率來看不是特別的高,對於常規的輕量級而言比SQLite要好很多,若是真的存儲量不大能夠考慮本身定義文件格式。xml 處理時Dalvik會經過自帶底層的本地XML Parser解析,好比XMLpull方式,這樣對於內存資源佔用比較好。 它的本質是基於XML文件存儲key-value鍵值對數據,一般用來存儲一些簡單的配置信息。其存儲位置在/data/data/< >/shared_prefs目錄下。SharedPreferences對象自己只能獲取數據而不支持存儲和修改,存儲修改是經過Editor對象實現。 實現SharedPreferences存儲的步驟以下:1、根據Context獲取SharedPreferences對象2、利用edit()方法獲取Editor對象。3、經過Editor對象存儲key-value鍵值對數據。4、經過commit()方法提交數據。 下面是示例代碼: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //獲取SharedPreferences對象 Context ctx = MainActivity.this; SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE); //存入數據 Editor editor = sp.edit(); editor.putString("STRING_KEY", "string"); editor.putInt("INT_KEY", 0); editor.putBoolean("BOOLEAN_KEY", true); editor.commit(); //返回STRING_KEY的值 Log.d("SP", sp.getString("STRING_KEY", "none")); //若是NOT_EXIST不存在,則返回值爲"none" Log.d("SP", sp.getString("NOT_EXIST", "none")); } } 這段代碼執行事後,即在/data/data/com.test/shared_prefs目錄下生成了一個SP.xml文件,一個應用能夠建立多個這樣的xml文件。 SharedPreferences對象與SQLite數據庫相比,免去了建立數據庫,建立表,寫SQL語句等諸多操做,相對而言更加方便,簡潔。可是SharedPreferences也有其自身缺陷,好比其職能存儲boolean,int,float,long和String五種簡單的數據類型,好比其沒法進行條件查詢等。因此不論SharedPreferences的數據存儲操做是如何簡單,它也只能是存儲方式的一種補充,而沒法徹底替代如SQLite數據庫這樣的其餘數據存儲方式。第二種: 文件存儲數據關於文件存儲,Activity提供了openFileOutput()方法能夠用於把數據輸出到文件中,具體的實現過程與在J2SE環境中保存數據到文件中是同樣的。文件可用來存放大量數據,如文本、圖片、音頻等。默認位置:/data/data/< >/files/***.***。 代碼示例: public void save(){ try { FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE); outStream.write(text.getText().toString().getBytes()); outStream.close(); Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { return; } catch (IOException e){ return ; } } openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符「/」 ,若是文件不存在,Android 會自動建立它。建立的文件保存在/data/data//files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,經過點擊Eclipse菜單「Window」-「Show View」-「Other」,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,而後在File Explorer視圖中展開/data/data//files目錄就能夠看到該文件。 openFileOutput()方法的第二參數用於指定操做模式,有四種模式,分別爲:Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2Context.MODE_PRIVATE:爲默認操做模式,表明該文件是私有數據,只能被應用自己訪問,在該模式下,寫入的內容會覆蓋原文件的內容,若是想把新寫入的內容追加到原文件中。可使用Context.MODE_APPENDContext.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,不然就建立新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其餘應用是否有權限讀寫該文件。MODE_WORLD_READABLE:表示當前文件能夠被其餘應用讀取;MODE_WORLD_WRITEABLE:表示當前文件能夠被其餘應用寫入。 若是但願文件被其餘應用讀和寫,能夠傳入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套本身的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其餘資源好比文件的時候,就須要userid匹配。默認狀況下,任何應用建立的文件,sharedpreferences,數據庫都應該是私有的(位於/data/data//files),其餘程序沒法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其餘程序才能正確訪問。 讀取文件示例: public void load(){ try { FileInputStream inStream=this.openFileInput("a.txt"); ByteArrayOutputStream stream=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int length=-1; while((length=inStream.read(buffer))!=-1) { stream.write(buffer,0,length); } stream.close(); inStream.close(); text.setText(stream.toString()); Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e){ return ; } } 對於私有文件只能被建立該文件的應用訪問,若是但願文件能被其餘應用讀和寫,能夠在建立文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權限。 Activity還提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用於獲取/data/data//cache目錄 getFilesDir()方法用於獲取/data/data//files目錄。 把文件存入SDCard:使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,通常手機的存儲空間不是很大,存放些小文件還行,若是要存放像視頻這樣的大文件,是不可行的。對於像視頻這樣的大文件,咱們能夠把它存放在SDCard。SDCard是幹什麼的?你能夠把它看做是移動硬盤或U盤。 在模擬器中使用SDCard,你須要先建立一張SDCard卡(固然不是真的SDCard,只是鏡像文件)。 建立SDCard能夠在Eclipse建立模擬器時隨同建立,也可使用DOS命令進行建立,以下: 在Dos窗口中進入android SDK安裝路徑的tools目錄,輸入如下命令建立一張容量爲2G的SDCard,文件後綴能夠隨便取,建議使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中訪問SDCard,你須要申請訪問SDCard的權限。 在AndroidManifest.xml中加入訪問SDCard的權限以下:<!-- 在SDCard中建立與刪除文件權限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard寫入數據權限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,而且能夠進行讀寫。注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權限。 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄 File saveFile = new File(sdCardDir, 「a.txt」); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write("test".getBytes()); outStream.close(); } Environment.getExternalStorageState()方法用於獲取SDCard的狀態,若是手機裝有SDCard,而且能夠進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。 Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,固然要獲取SDCard的目錄,你也能夠這樣寫: File sdCardDir = new File("/sdcard"); //獲取SDCard目錄 File saveFile = new File(sdCardDir, "itcast.txt"); //上面兩句代碼能夠合成一句: File saveFile = new File("/sdcard/a.txt"); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write("test".getBytes()); outStream.close();第三種: SQLite數據庫存儲數據 SQLite是輕量級嵌入式數據庫引擎,它支持 SQL 語言,而且只利用不多的內存就有很好的性能。此外它仍是開源的,任何人均可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLiteSQLite 由如下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 經過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。 特色: 面向資源有限的設備, 沒有服務器進程, 全部數據存放在同一文件中跨平臺, 可自由複製。 SQLite 基本上符合 SQL-92 標準,和其餘的主要 SQL 數據庫沒什麼區別。它的優勢就是高效,Android 運行時環境包含了完整的 SQLite。 SQLite 和其餘數據庫最大的不一樣就是對數據類型的支持,建立一個表時,能夠在 CREATE TABLE 語句中指定某列的數據類型,可是你能夠把任何數據類型放入任何列中。當某個值插入數據庫時,SQLite 將檢查它的類型。若是該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。若是不能轉換,則該值將做爲其自己具備的類型存儲。好比能夠把一個字符串(String)放入 INTEGER 列。SQLite 稱這爲「弱類型」(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。Android 集成了 SQLite 數據庫 Android 在運行時(run-time)集成了 SQLite,因此每一個 Android 應用程序均可以使用 SQLite 數據庫。 對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 至關簡單。可是,因爲 JDBC 會消耗太多的系統資源,因此 JDBC 對於手機這種內存受限設備來講並不合適。所以,Android 提供了一些新的 API 來使用 SQLite 數據庫,Android 開發中,程序員須要學使用這些 API。數據庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 數據庫 Activites 能夠經過 Content Provider 或者 Service 訪問一個數據庫。下面會詳細講解若是建立數據庫,添加數據和查詢數據庫。 建立數據庫 Android 不自動提供數據庫。在 Android 應用程序中使用 SQLite,必須本身建立數據庫,而後建立表、索引,填充數據。 Android 提供了 SQLiteOpenHelper 幫助你建立一個數據庫,你只要繼承 SQLiteOpenHelper 類,就能夠輕鬆的建立數據庫。SQLiteOpenHelper 類根據開發應用程序的須要,封裝了建立和更新數據庫使用的邏輯。SQLiteOpenHelper 的子類,至少須要實現三個方法: 1 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法須要四個參數:上下文環境(例如,一個 Activity),數據庫名字,一個可選的遊標工廠(一般是 Null),一個表明你正在使用的數據庫模型版本的整數。 2 onCreate()方法,它須要一個 SQLiteDatabase 對象做爲參數,根據須要對這個對象填充表和初始化數據。 3 onUpgrage() 方法,它須要三個參數,一個 SQLiteDatabase 對象,一箇舊的版本號和一個新的版本號,這樣你就能夠清楚如何把一個數據庫從舊的模型轉變到新的模型。第四種 使用ContentProvider存儲數據 ContentProvider其實也是經過數據庫的方式來存儲數據的,所以這裏再也不作詳細介紹第五種 網絡存儲數據 也就是說將數據保存在服務器,android上只須要經過httpclient發起一個請求,向服務器獲取數據便可