數據持久化就是將內存中的瞬時數據保存到存儲設備中,保證即便在手機或者是電腦關機的狀況下,數據也不會丟失。java
在android中數據持久化分爲三種:文件存儲、SharedPreferences存儲和數據庫存儲。android
數據持久化三種方式對比sql
方式 | 保存路徑 | 涉及到的類 | 特色 |
文件存儲 | /data/data/<packagename>/files/ | //從文件中讀取數據 Context.openFileInput(String fileName):FileInputStream //將數據存儲到文件中 Context.openFileOutput(String fileName, int mode):FileOutputStream |
不對存儲的內容進行任何的格式化處理,比較合適存儲一些簡單的文本數據或二進制數據 |
SharedPreferences存儲 | /data/data/<packagename>/shared_prefs/ | Context.getSharedPreferences(String name, int mode):SharedPreferences Activity.getPreferences(int mode):SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences |
使用鍵值對的方式來存儲數據,保存數據更加方便。數據以明文的方式保存在文件中,須要加密 |
數據庫 | /data/data/<packagename>/databases/ | SqLiteOpenHelper類、SQLiteDatabase類 | 能夠保存大量複雜的關係型數據 |
調用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream數據庫
其中,mode的值有兩個,分別爲:Context.MODE_PRIVATE和Context.MODE_APPENDapp
Context.MODE_PRIVATE:爲默認模式,表示當指定相同文件名的時候,會覆蓋原有文件。this
Context.MODE_APPEND:表示文件已經存在時,會將內容追加到以前的文件中。加密
下面是一個例子:spa
/** * 保存數據 * @param view */ public void saveData(View view){ String text = inputText.getText().toString(); if(!TextUtils.isEmpty(text)){ FileOutputStream fileOutputStream = null; BufferedWriter fileWriter = null; try{ // fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是會被覆蓋掉 fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基礎之上追加內容 fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream)); fileWriter.write(text); fileWriter.write("\r\n"); }catch (FileNotFoundException e){ Log.e(TAG, "saveData: 文件不存在"); }catch (IOException e){ Log.e(TAG, "saveData: IOException"+e.getMessage() ); }finally { try { if (null != fileWriter) { fileWriter.close(); } }catch (IOException e){ Log.e(TAG, "finally: IOException"+e.getMessage() ); } inputText.setText(""); } } }
從文件中讀取數據Context.openFileInput(String fileName):FileInputStream3d
示例代碼:code
/** * 讀取數據 * @param view */ public void readData(View view){ FileInputStream fileInputStream = null; BufferedReader bufferedReader = null; try { fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME); bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); String readLine = null; StringBuffer stringBuffer = new StringBuffer(); while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){ stringBuffer.append("\r\n"); stringBuffer.append(readLine); } inputtedText.setText(stringBuffer.toString()); }catch (FileNotFoundException e){ Log.e(TAG, "readData:" +e.getMessage()); }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); }finally { try { if(null != bufferedReader){ bufferedReader.close(); } }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); } } }
在這個程序中,對應的包名爲:
三種不一樣的實現方式對比
實現方式 | 方法解析 | 保存的文件名 |
Context.getSharedPreferences(String name, int mode):SharedPreferences | name:SharedPreferences文件的名稱. mode:目前只有MODE_PRIVATE這一種模式,是默認操做,表示只有當前的程序才能夠對此SharedPreference進行操做 |
name所定義的名字 |
Activity.getPreferences(int mode):SharedPreferences | 當前活動的類名做爲文件名 |
|
PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences | 當前應用程序包名做爲前綴 |
調用SharedPreferences.Editor類,使用putXXX()方法,而後調用SharedPreferences.Editor的apply()便可。具體使用哪個put方法,根據數據類型來決定。
直接調用SharedPreferences類的getXXX()方法。具體調用哪個get方法,根據數據類型來決定。
Android主要使用Sqlite數據庫做爲系統默認數據庫。
主要涉及到SQLiteOpenHelper和SQLiteDatabase這兩個類。SQLiteOpenHelper是一個接口,主要負責數據庫的建立和升級。SQLiteDatabase類主要負責執行對應的sql語句。
SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)這兩個方法須要重寫,onCreate方法在數據庫初次被建立時調用。onUpgrade方法,在傳入的newVersion參數發生改變的時候,進行調用。newVersion參數,在SQLiteOpenHelper的構造方法中傳入。
其中SQLiteDatabase能夠經過SQLiteOpenHelper類的getWritableDatabase()和getReadableDatabase()這兩個方法得到。當數據庫不能夠寫入的時候,調用getWritableDatabase()會出現異常。調用這兩個方法的過程當中,會建立或者打開已有的數據庫文件。
對於數據庫的增長、修改、和刪除操做均可以直接調用execSQL方法,可是查詢就須要調用rawQuery方法。
具體事例以下:
sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"}); sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"}); sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"}); Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);
integer表示整形,real表示浮點型,text表示文本類型,blob表示二進制類型。