今天學習第六章
荒廢了幾天想想還是看書學習吧,沒有其他的更好的學習方式了。
還是不看視頻學習了。
數據存儲全方案——詳解持久化技術
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);
}
});
}
}
下面是結果截圖: