1. 程式人生 > >安卓資料持久化:檔案儲存、SharedPreferences儲存以及資料庫儲存

安卓資料持久化:檔案儲存、SharedPreferences儲存以及資料庫儲存

1,檔案儲存 手機自帶的記憶體,只能供當前應用程式訪問,其他應用程式訪問不了,程式解除安裝這些資料也會隨著消失 原理: 基本是先獲取一個檔案的輸出流,然後把資訊write進去,最後關閉流 a,通過上下文類context的openFileOutput()方法獲得一個FileOutputStream輸出流 b,要寫入的內容通過write()寫到FileOutputStream物件 c,關閉流 openFileOutput()可以將資料儲存到指定的檔案中,方法有兩個引數,第一個引數是檔名,不需要帶上完整的路徑,因為這裡都是預設儲存到data/data/file下面的 第二個引數是檔案的操作模式,兩種:MODE_PRIVATE和MODE_APPEND.前者是覆蓋,後者是追加 (MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,前者是允許只讀,後者是隻寫,但是都被拋棄,因為不安全)
private void save(String inputText ) {
           FileOutputStream fos = null;
           BufferedWriter writer = null;
            try {
               fos = openFileOutput( "data", Context.MODE_PRIVATE);
               writer = new BufferedWriter( new OutputStreamWriter(fos));
                writer.write( inputText);
           } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
           } finally {
                 try {
                      if( writer != null)
                            writer.close();
                }catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                }
主要的就是上面的三句話 openFileOutput開啟一個輸出流,然後構建一個位元組緩衝流物件然後寫資料, 此外還有幾個方法需要特別注意一下 ,這幾個方法對於檔案關係提供了更好的支援,配合上面介紹的方式, 就可以對檔案的資料進行常規的CRUD操作 (增刪改查),方法如下: File getFIlesDir ():獲取檔案系統的絕對路徑。 boolean deleteFile(String name):刪除一個指定檔名為name的檔案。 String[] fileList() :當前應用內部儲存路徑下的所有檔名。 上一節中的儲存資料到手機記憶體也有一些方法
 //幫助我們返回一個目錄
  //context.getCacheDir ()的話就是儲存到cache快取資料夾下面     
File file=new File(context.getFilesDir(), "userinfo.txt");           
       FileOutputStream fos= new FileOutputStream( file);          
            //zhangsan 123
            fos.write(( username+ "##"+ password).getBytes());
            fos.close();

也是可以儲存資料的          --------------------- 來看看讀資料 讀資料也是主要是用到一個開啟輸入的函式openFileInput
private void read( ) {
           FileInputStream fis= null;
           BufferedReader reader = null;

           StringBuilder sb=new StringBuilder();
            try {
               fis= openFileInput( "data");
             reader= new BufferedReader( new InputStreamWriter(fis));
               String line="";
               while((line=reader.readerLine())!=null){
                   sb.append(line)
                    }
           } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
           } finally {
                 try {
                      if( reader!= null)
                            reader.close();
                }catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                }
主介面中
String inputText = load();
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded",
Toast.LENGTH_SHORT).show();
}

setSelection()方法將輸入游標移動到文字的末尾位置以便再次輸入 TextUtils.isEmpty()方法可以一次性進行兩種空值的判斷,當傳入的字串為空或者是null的時候都會返回true 總的來說檔案儲存不適合用於儲存複雜的資料 ------------------------------------------------------------------------------------------------------------------------ 2,SharedPreferences儲存 首先來看儲存資料 SharedPreferences儲存是利用鍵值對的方式來儲存的,感覺有點類似map集合 要使用該方法來儲存資料就要先獲得一個SharedPreferences物件,有三種獲取方法 a,Context上下文類中的getSharedPreferences 兩個引數,第一個是指定檔案的名稱,不在就建立。目錄也是在data/data/包名/shared_prefs目錄下 第二個引數是操作模式。MODE_PRIVATE是預設的,只允許當前的應用程式對其進行操作,MODE_MULTI_PROCESS是一般用於有多個程序中對同一個SharedPreferences檔案進行讀寫的情況,同樣有MODE_WORLD_WRITEABLE MODE_WORLD_READABLE兩個被廢棄的模式 b,Activity類中的getPreferences 只有一個引數,也是操作模式,檔案的名稱是預設的當前活動的類名 c,PreferenceManager管理類中的getDefaultSharedPreferences() 管理類中的一個靜態方法,接收一個context引數,自動把當前的包名作為檔案命名的字首 得到一個物件之後,有三步來進行資料的儲存 1,呼叫物件的edit方法獲得一個SharedPreferences.Editor物件 2,向.Editor物件新增資料,putBoolean()或者是putString(),,等等putXXX()方法 3,呼叫commit方法將新增的資料提交,完成資料的儲存操作 看一個例項:
@Override
public void onClick(View v) {
      // TODO Auto-generated method stub
 SharedPreferences.Editor editor=getSharedPreferences( "data", MODE_PRIVATE).edit();
             editor.putString( "name", "hl174");
             editor.putInt( "age", 18);
             editor.putBoolean( "吃飯沒", false );
             editor.commit();        
           }
     });
最後看結果