Android回顧--(十二) 資料儲存的幾種方式

weixin_34249678發表於2018-07-28

ProgressDialog:

一個含有進度條以及訊息提示的彈窗
使用方式:

// 1、建立物件
ProgressDialog dialog = new ProgressDialog(context);

// 2、通過物件呼叫相應的方法來完成資訊的設定
dialog.setTitle("軟體更新");
dialog.setMessage("軟體正在更新,請勿關閉");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

// 3、設定事件的監聽
 dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                dialog.dismiss();
            }
        });
// 4、show
dialog.show()

資料的儲存

  • sharePrefrence
  • 本地的儲存(內部儲存/外部儲存)
  • 資料庫的儲存
  • ContentProvider的儲存
  • 網路儲存

內部儲存

  內部儲存實際上是手機中一塊特定的儲存區域,在這塊區域中主要存放的是手機中安裝程式和系統檔案。

內部儲存的訪問

  1. 檔案的建立
 private void createFile() throws IOException{
        File file = getFilesDir();     //通過方法獲取檔案類的物件
        File file1 = new File(file,"hello.txt");
        if (!file1.exists()){
            file1.createNewFile();
        }
    }
  1. 向內部儲存寫入檔案內容
   private void writeContentToFile(){
       FileOutputStream out = null;
       try {
           File file = new File(getFilesDir(),"hello.txt");
           out = new FileOutputStream(file);
           out.write("yeah!this is JonyZ ".getBytes());
       }catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }finally {
           try {
               out.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }

3 . 讀取檔案裡面的內容

   private void readFileContent(){
        File file = new File(getFilesDir(),"hello.txt");
        try {
            FileInputStream in = new FileInputStream(file);
            byte[] buf = new byte[(int) file.length()]; //這樣寫是一直檔案非常小的時候,直接使用檔案的長度。但是,一般在工作中,用於讀寫的檔案都非常的大,不能這樣寫。後續我會詳細的講解IO流
            in.read(buf);
            in.close();
            String result = new String(buf);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4、建立目錄
file.mkdirs():建立級聯目錄
file.mkdir():建立單個目錄

File file = getDir("jony",Context.MODE_PRIVATE);  //第一個引數,表示當前應用下的根目錄建立目錄。第二個引數,私有模式。只有當前應用可以訪問
String path = getActivity().getFilesDir().getAbsolutePath()+"jony";
new File(path).mkdir();

5、刪除目錄或者檔案

    public void deleteFileOrDir(File file){
        if (file.isFile()){
            file.delete();
        }else if (file.isDirectory()){  //如果當前要刪除的檔案是目錄,需要先刪除裡面的,再刪除當前檔案
            File[] files = file.listFiles();
            if (files!=null){
                for (int i = 0; i < files.length; i++) {
                    deleteFileOrDir(files[i]);
                }
            }

        }
    }

SharePrefences:輕量級儲存

  1. 用於何處:

    • 放置使用者的登陸資訊
    • 放置軟體的配置資訊
    • 放置一些臨時資料
  2. 特點:

    • 資料的儲存採用的是鍵值對的形式來進行儲存的
    • 裡面的鍵是不能重複的
    • 裡面的值是可以重複的 (map)

使用步驟:

  1. 新增資料到sp
    • 獲取sp物件
      SharePrefences sp = getSharePreferences("login",Context.MODE_PRIVATE);
      第一個引數:表示sp裡面的xml檔案的名稱,不能新增xml
      第二個引數:表示建立的檔案的訪問許可權,一般都是寫private表示只能夠自己訪問這個檔案,其他的應用不能訪問。
    • 獲取Edit物件
      Editor edit = sp.edit();
    • 通過Edit物件的put方法來向裡面新增資料
      edit.putBoolean("key1",true);
      edit.putString("userName","jony");
      edit.putInt("key2",0825);
    • 新增完資料之後,必須提交這個事物,不提交就沒有辦法將資料新增進去
      edit.commit();
  2. 訪問sp,從sp中獲取資料
    • 獲取sp物件
      SharePrefences sp = getSharePreferences("login",Context.MODE_PRIVATE);
    • 通過sp的get方法獲取資料
      sp.getString("userName",""); // 獲取資料
      第一個引數:獲取資料的鍵
      第二個引數:如果沒有通過鍵獲取到值,預設的值
      boolean b = sp.getBoolean("key1",false);
      String userName = sp.getString("userName","");
      int key2 = sp.getInt("key2",-1);
  3. 清空sp
    • 獲取sp物件
    • 獲取Edit物件
    • 通過edit.clear()或者edit.remove()來選擇刪除資料
    • 提交這個事件的請求

SDcard檔案的相關操作

具體的我已經封裝好了一個幫助類,如下

import android.os.Environment;
import android.os.StatFs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class SDUtils {
    /**
     * 檢測SdCard是否已經掛載
     *
     * @return
     */
    public static boolean checkSdCardExitOrNot() {
        String state = Environment.getExternalStorageState();   //獲取SdCard狀態
        if (Environment.MEDIA_MOUNTED.equals(state)) {   //掛載狀態,可讀可寫
            return true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {   //已掛載但只可讀
            return false;
        } else {
            return false;
        }
    }

    /**
     * 獲取當前SdCard的剩餘空間大小
     *
     * @return
     */
    public static int getFreeSpaceSize() {
        //第一步:獲取SdCard的根目錄
        File file = Environment.getExternalStorageDirectory();
        //第二步:獲取StaFs-->這個類是專門用來獲取系統訊息的
        StatFs fs = new StatFs(file.getAbsolutePath());
        //第三步 獲取每一個塊的大小
        int blockSize = fs.getBlockSize();//注意,這個方法在api 18的時候已經過時了,目前版本使用的是         fs.getBlockCountLong();
//獲取空閒塊的數量
        int availableBlocks = fs.getAvailableBlocks();
        return availableBlocks * blockSize / 1024 / 1024;
    }

    /**
     * 判斷檔案是否存在
     *
     * @param path
     * @return
     */
    public static boolean checkFileExistOrNot(String path) {
        File file = new File(path);
        if (!file.exists()) {
            return false;
        }
        return true;
    }

    /**
     * 判斷檔案是否存在,不存在就建立
     *
     * @param path
     */
    public static void createFile(String path) {
        File file = new File(path);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 建立目錄
     *
     * @param path
     */
    public static void createDir(String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    /**
     * 刪除檔案
     *
     * @param file
     */
    public static void deleteFile(File file) {
        if (file.isFile()) { //如果是單檔案,那麼直接刪除
            file.delete();
        } else if (file.isDirectory()) {  //當前檔案是目錄,先刪除下面的檔案,再刪除當前檔案
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                deleteFile(files[i]);
            }
        }
        file.delete();
    }

    public static void copyFile(File fileSource, File fileDesternation) {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(fileSource);
            out = new FileOutputStream(fileDesternation);
            byte[] buf = new byte[1024];
            int length;
            while ((length = in.read(buf)) != -1) {
                out.write(buf, 0, length);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

相關文章