Android之文件存儲和SharedPreference存儲

今天學習第六章
荒廢了幾天想想還是看書學習吧,沒有其他的更好的學習方式了。
還是不看視頻學習了。

數據存儲全方案——詳解持久化技術

Android系統中主要提供了三種方式用於簡單地實現數據持久化功能:

1.文件存儲

2.SharedPreference存儲

3.數據庫存儲

當然除了這三種方式外,你還可以將數據保存在手機的SD卡中,不過使用文件,SharedPreference或數據庫保存數據會相對更簡單一些,而且比起將數據保存在SD卡中會更加地安全。

文件存儲

適合用於存儲一些簡單的文本數據或二進制數據。

如果你想使用文件存儲的方式來保存一些較爲複雜的文本數據,就需要定義一套自己的格式規範,這樣可以方便之後需將數據從文件中重新解析出來。

將數據存儲到文件中

Context類中提供了一個openFileOutput()方法,用於存儲到指定的文件中。

openFileOutput()方法接收兩個參數:

第一個參數是文件名,在文件創建的時候使用的就是這個名稱,注意這裏指定的文件名不可以包含路徑,因爲所有的文件都是默認存儲到/data/data//files/目錄下的。

第二個參數是文件的操作模式,主要有兩種模式可選,MODE_PRIVATE和MODE_APPEND。

其中MODE_PRIVATE是默認的操作模式,表示當指定同樣文件名的時候,所寫入的內容將會覆蓋原文件中的內容。

而MODE_APPEND則表示如果該文件已存在,就往文件裏面追加內容,不存在就創建新文件。

openFileOutput()方法返回的是一個FileOutputStream對象,得到了這個對象之後就可以使用JAVA流的方式將數據寫到文件中。

public void save(){
	String data = "Data to save";
	FileOutputStream out = null;
	BufferedWriter writer = null;
	try{
		out = OpenFileOutput("data",Context.MODE_PRIVATE);
		writer = new BufferedWriter(new OutputStreamWriter(out));
		writer.write(data);
	}catch(IOException e){
		e.printStackTrace();
	}finally{
		try{
			if(writer!=null){
				writer.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

在這裏簡單複習一下java流:

1.對文件進行操作FileInputStream(字節輸入流),FileOutputStream(字節輸出流),FileReader(字符輸入流),FileWriter(字符輸出流)

2.Buffered緩衝流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是帶緩衝區的處理流,緩衝區的作用的主要目的是:避免每次和硬盤打交道,提高數據訪問的效率。

3.轉化流 InputStreamReader/OutputStreamWriter,把字節轉化成字符。

從文件中讀取數據

類似於將數據存儲到文件中,Context類中還提供了一個openFileInput()方法,用於從文件中讀取數據.

openFileInput()只接收一個參數,既要讀取的文件名,然後系統會自動到/data/data/files/目錄下去加載這個文件

並返回一個fileInputStream對象,得到這個對象後再通過Java流的方式就可以將數據讀取出來了。

public String load{
	FileInputStream in = null;
	BufferedReader reader = null;
	StringBuilder content = new StringBuilder();
	try{
		in = OpenFileInput("data");
		reader = new BufferedRead(new InputStreamReader(in));
		String line = "";
		while((line = reader.readline())!= null){
			content.append(line);
		}
	}catch(IOException){
		e.printStackTrace();
	}finally{
		if(reader != null ){
			try{
				reader.close();
			}catch(IOException){
					e.printStackTrace();
				}
		}
	}
	return content.toString();
	}

首先通過openFileInput()方法獲取到了一個FileInputStream對象,然後藉助它又構建出了一個InputStreamReader對象,接着再使用InputStreamReader構建出一個BufferedReader對象,這樣我們就可以通過BufferedReader進行一行行地讀取,把文件中所有的文本內容全部讀取出來,並存放到一個StringBuilder對象中,最後將讀取到的內容返回。

SharedPrefences存儲

不同於文件的存儲方式,SharePreference是使用鍵值對的方式來存儲數據的。
也就是說,當保存一條數據的時候,需要給這條數據提供一個對應的鍵,這樣在數據讀取的時候就可以通過這個鍵把相應的值取出來。
而且SharePreference還支持多種不同的數據類型存儲,如果存儲的數據類型是整形,那麼讀取出來的數據也是整形的。如果存儲的數據是一個字符串,
那麼讀取出來的數據仍然是字符串。

將數據存儲到SharePreference

要想使用SharePreference來存儲數據,首先需要獲取到SharedPreferences對象。

Android中主要提供了3種方法用於得到SharedPreference對象。

1.Context類中的getSharedPreferences()方法

此方法接收兩個參數,第一個參數用於指定SharedPreference文件的名稱,如果指定的文件不存在則會創建一個,SharePreference文件都是存放在/data/data//shared_prefs/目錄下的。

第二個參數用於指定操作模式,目前只有MODE_PRIVATE這一種模式可選,它是默認的操作模式,和直接傳入0效果是相同的。表示只有當前的應用程序纔可以對這個SharedPreference文件進行讀寫。

其他的幾種模式已經廢棄。

2.Activity類中的getPreferences()方法

這個方法和Context中的getSharedPreferences()方法很相似,不過它只接收一個操作參數,因爲使用這個方法時會自動將當前活動的類名作爲SharedPreference的文件名。

3.PreferenceManager類中的 getDefaultSharedPreference()方法

這是一個靜態方法,它接收一個Context參數,並自動使用當前應用程序的包名作爲前綴來命名SharedPreference文件,得到了SharedPreference對象之後,就可以開始向SharedPreference文件中存儲數據了。

存儲數據三步實現:

(1)調用SharedPreference對象的edit()方法來獲取一個SharedPreference.Editor對象

(2)向SharedPreference.Editor對象中添加數據,比如添加一個布爾型數據就是用putBoolean()方法,添加一個字符串則使用putString()方法,以此類推。

(3)調用apply()方法將添加的數據提交,從而完成數據存儲操作。

例子:

新建一個SharedPrenferenceTest項目,然後修改activity_main.xml中的代碼

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="net.nyist.lenovo.sharedpreferencestest.MainActivity">
    
    <Button
    android:id="@+id/btn_SaveData"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save data"
    />
    </LinearLayout>

然後修改MainActivity的代碼:

 public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button saveData = (Button) findViewById(R.id.btn_SaveData);
    saveData.setOnClickListener(new View.OnClickListener() {
	//給按鈕註冊一個點擊事件
    @Override
    public void onClick(View v) {
    SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
    //指定文件名爲data,並且得到SharedPreference.Editor對象。
	editor.putString("name","Tom");
    editor.putInt("age",18);
    editor.putBoolean("married",false);
	//添加三個不同類型的數據
    editor.apply();
	//最後提交
    }
    });
    }
    }

從SharedPrenferences中讀取數據

SharedPrenferences對象中提供了一系列的get方法,用於對存儲的數據進行讀取。

每種get方法都對應了SharedPrenferences.Editor中的一種put方法。

這些get方法都接收兩個參數:

第一個參數是鍵,傳入存儲數據時使用的鍵就可以得到相應的值了。

第二個參數是默認值,即表示當傳入的鍵找不到對應的值時會以什麼樣的默認值進行返回。

還是剛纔的那個例子:

修改activity_main.xml中的代碼:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="net.nyist.lenovo.sharedpreferencestest.MainActivity">
    
    <Button
    android:id="@+id/btn_SaveData"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save data"
    />
    
    <Button
    android:id="@+id/restore_data"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Restore data"
    />
    
    </LinearLayout>

這裏增加一個還原數據的按鈕,然後修改MainActivity中的代碼:

 public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    		······
    Button restoreData = (Button) findViewById(R.id.restore_data);
    restoreData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    SharedPreferences pres = getSharedPreferences("data",MODE_PRIVATE);
	//首先通過getSharedPreferences()方法得到了SharedPreferences對象
    int age = pres.getInt("age",0);
    String name = pres.getString("name","");
    boolean  married = pres.getBoolean("married",false);
    Log.d("MainActivity","name is"+name);
    Log.d("MainActivity","age is "+age);
    Log.d("MainActivity","married is "+married);
    }
    });
    }
    }

下面是結果截圖:

存儲數據到SharedPreference
存儲成功

讀取數據

讀取成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章