安卓開發之資料儲存方式

cxmscb發表於2016-07-27

一、Android資料儲存方式

  1. 內部儲存:一般來說,內部儲存即data資料夾下的儲存,包括:

    • SharedPrefrence儲存
    • 手機內部檔案儲存
    • Sqlite資料庫儲存
  2. 外部儲存:外部儲存一般就是我們上面的storage資料夾/mnt資料夾

    • 手機外部檔案儲存
  3. 遠端伺服器儲存

    這裡寫圖片描述

二、SharedPrefrence儲存

  1. SP儲存專門用來儲存一些單一的小資料,例如一些基本資料型別資料
  2. 儲存資料型別:boolean,float,int,long,String
  3. 資料儲存的路徑:/data/data/包名/shared_prefs/xxx.xml
    xml檔案內容示例:
    這裡寫圖片描述

  4. 可以設定資料只能是當前應用讀取,別的應用不可以讀取

  5. 應用解除安裝 時會刪除儲存資料的xml檔案

一、相關API

  1. 獲取SharedPrefrence例項

    SharedPreferences本身是一個介面,程式無法直接建立SharedPreferences例項,只能通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences例項,該方法中name表示要操作的xml檔名,第二個引數如下:

    Context.MODE_PRIVATE: 指定該SharedPreferences資料只能被本應用程式讀、寫。
    
    Context.MODE_WORLD_READABLE:  指定該SharedPreferences資料能被其他應用程式讀,但不能寫。
    
    Context.MODE_WORLD_WRITEABLE:  指定該SharedPreferences資料能被其他應用程式讀,寫
    
  2. 從SP檔案中得到相關資料:

    SharedPreferences  .getXxx(String key, Xxx defaultname);
    
  3. 更新SP檔案內容的介面:Editor

    獲取SharedPreferences的Editor物件: SharedPreferences editor();
    
    SharedPreferences.Editor clear():清空SharedPreferences裡所有資料
    
    SharedPreferences.Editor putXxx(String key , xxx value): 向SP存入指定key對應的資料,其中xxx 可以是boolean,float,int等各種基本型別據
    
    SharedPreferences.Editor remove(): 刪除SharedPreferences中指定key對應的資料項
    
    //上述方法可以進行方法鏈呼叫(返回的是Editor物件本身)
    
    boolean commit(): 當Editor編輯完成後,使用該方法提交修改才可以真正地把修改後的內容儲存到檔案中。
    
  4. 讀寫其他應用程式的SharedPreferences(跨應用讀取資料)

    // 1. 建立其他應用程式對應的Context:
    Context otherContext = this.createPackageContext("其他應用程式的包名", Context.CONTEXT_IGNORE_SECURITY);
    
    // 2.獲取對應的SharedPreferences物件,注意相應的mode
    SharedPreferences sharedPreferences
    = otherContext.getSharedPreferences("相關的xml檔名", Context.MODE_WORLD_READABLE);
    
    //3.獲取SP物件成功之後,可實現對應的讀/寫操作。
    ...
    

二、手機內部檔案儲存

  1. 應用執行時需要的一些較大的資料/圖片可以用檔案儲存到手機內部
  2. 檔案型別:任意
  3. 檔案儲存的位置:/data/data/包名/files/
  4. 可以設定資料只能當前應用讀取,別的應用不可以
  5. 應用解除安裝時,檔案會被刪除

一、相關API

  • 讀取/data/data/包名/files/中的檔案

    FileInputStream fis = this.openFileInput(“檔名”);

  • 儲存檔案到/data/data/包名/files/中

    FileOutputStream fos = this.openFileOutput(“指定要儲存的檔名”,int mode);

  • 得到files資料夾物件:

    File filesDir = this.getFilesDir();

二、儲存檔案程式碼示例

將assets下的bg.png檔案複製儲存到手機內部

//得到assets下的bg.png檔案的InputStream
AssetManager manager = this.getAssets();
InputStream is = manager.open("bg.png");

//得到files下的bg.png檔案的輸出流
FileOutputStream fos = openFileOutput("bg.png",Context.MODE_PRIVATE);

//邊讀邊寫
byte[] buffer = new byte[1024];
int len = -1;
while((len=is.read(buffer))!=-1){

    fos.write(buffer,0,len);

}

is.close();
fos.close();
//儲存完成

三、讀取檔案程式碼示例

讀取files下的bg.png檔案,並載入圖片檔案。

//獲取檔案的輸入流
InputStream is = (InputStream) this.openFileInput("bg.png");

//將輸入流解析為bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);

//顯示bitmap
((ImageView)findViewById(R.id.imageView)).setImageBitmap(bitmap);
is.close();

/*----第二種寫法----*/

//獲取files資料夾
File filesDir = this.getFilesDir();

//獲取檔案的絕對路徑
String filePath = filesDir.getAbsolutePath()+"/bg.png";

//解析與顯示
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
((ImageView)findViewById(R.id.imageView)).setImageBitmap(bitmap);

三、SD卡外部儲存

  1. 應用執行用到的資料檔案可以儲存到sd卡中
  2. 檔案型別:任意
  3. 資料儲存的路徑:

    • 路徑1(包名路徑):/storage/sdcard/Android/data/包名/files/
    • 路徑2:/storage/sdcard/xxx/(其中xxx自定義)
  4. 路徑1:其他應用可以訪問,應用解除安裝時被刪除

  5. 路徑2:其他應用可以訪問,應用解除安裝時不被刪除
  6. 必須保證sd卡掛載在手機上才能讀寫,否則不能操作。

一、相關API

  • Environment:操作SD卡的工具類

    • 得到SD卡的狀態:Environment.getExternalStorageState();

    • SD卡可讀寫的掛載狀態值:Environment.MEDIA_MOUNTED(字串)

    • 得到SD卡的根目錄路徑:Environment.getExternalStorageDirectory();
      SD卡根目錄:/storage/sdcard/)

  • 得到路徑一的目錄(/storage/sdcard/Android/data/包名/files/)

    - context.getExternalFilesDir(String type)
    (type可以為null,也可以為路徑一下的子目錄名稱)
    
    例:
    context.getExternalFilesDir("music").getAbsolutePath() 為 /storage/sdcard/Android/data/包名/**files**/music (目錄不存在則自動建立)
    
  • 操作SD卡(讀寫)的許可權:

    - android.permission.WRITE_EXTERNAL_STORAGE 
    - android.permission.READ_EXTERNAL_STORAGE
    

二、儲存檔案到路徑1示例:

//判斷SD卡狀態  if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

        String fileName = "123.txt";
        String content = "abcdefg";

        File bookDir = this.getExternalFilesDir("Book");

        String filePath = bookDir.getAbsolutePath()+"/"+fileName;

        try {

            //得到指定檔案的FileOutputStream
            //(檔案建立/重寫)
            FileOutputStream fos = new FileOutputStream(filePath);

            fos.write(content.getBytes("utf-8"));

            fos.close();

            Toast.makeText(this,"儲存成功",Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }else {
        Toast.makeText(this,"SD未掛載",Toast.LENGTH_SHORT).show();
    }

//注意加許可權

三、從路徑1讀取檔案示例:

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

        String fileName = "123.txt";

        File bookDir = this.getExternalFilesDir("Book");

        String filePath = bookDir.getAbsolutePath()+"/"+fileName;

        try {
            //獲取檔案輸入流
            FileInputStream fis =   new FileInputStream(filePath);

            // 建立一個Byte 陣列輸出流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];

            int len = -1;

            while((len=fis.read(buffer))!=-1){

                baos.write(buffer,0,len);

            }
            fis.close();
            baos.close();

            String content = baos.toString();

            Toast.makeText(this,content,Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

四、儲存檔案到路徑2示例:

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

        String fileName = "123.txt";
        String content = "111在哪裡11在這裡22";

        //: /storage/sdcard
        File sdDir = Environment.getExternalStorageDirectory();

        //: /storage/sdcard/Book
        File bookDir = new File(sdDir.getAbsolutePath()+"/Book");

        if(!bookDir.exists()) bookDir.mkdir();

        //: /storage/sdcard/Book/fileName
        String filePath = bookDir.getAbsolutePath()+"/"+fileName;

        try {
            FileOutputStream fos = new FileOutputStream(filePath);

            fos.write(content.getBytes("utf-8"));

            fos.close();

            Toast.makeText(this,"儲存成功",Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }else {
        Toast.makeText(this,"SD未掛載",Toast.LENGTH_SHORT).show();
    }

五、從路徑2中讀取檔案示例:

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

        String fileName = "123.txt";

        //: /storage/sdcard/Book/fileName
        String filePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Book/"+fileName;

        try {
            FileInputStream fis =   new FileInputStream(filePath);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];

            int len = -1;

            while((len=fis.read(buffer))!=-1){

                baos.write(buffer,0,len);

            }
            fis.close();
            baos.close();

            String content = baos.toString();

            Toast.makeText(this,content,Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

相關文章