android: SharedPreferences存儲


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

這樣你應該就能明顯地感覺到,使用 SharedPreferences 來進行數據持久化要比使用文件方便很多,下面我們就來看一下它的具體用法吧。

 

6.3.1    將數據存儲到 SharedPreferences 中

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

中主要提供了三種方法用於得到 SharedPreferences 對象。

1.    Context 類中的 getSharedPreferences()方法 此方法接收兩個參數,第一個參數用於指定 SharedPreferences 文件的名稱,如果指

定的文件不存在則會創建一個,SharedPreferences 文件都是存放在/data/data/<package name>/shared_prefs/目錄下的。第二個參數用於指定操作模式,主要有兩種模式可以選 擇,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默認的操 作模式,和直接傳入 0 效果是相同的,表示只有當前的應用程序才可以對這個 SharedPreferences 文件進行讀寫。MODE_MULTI_PROCESS 則一般是用於會有多個進程中 對同一個 SharedPreferences 文件進行讀寫的情況。類似地,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 這兩種模式已在 Android 4.2 版本中被廢棄。

2.    Activity 類中的 getPreferences()方法

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

3.    PreferenceManager 類中的 getDefaultSharedPreferences()方法 這是一個靜態方法,它接收一個 Context 參數,並自動使用當前應用程序的包名作

為前綴來命名 SharedPreferences 文件。

得到了 SharedPreferences 對象之后,就可以開始向 SharedPreferences 文件中存儲數據了, 主要可以分為三步實現。

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

2.    向 SharedPreferences.Editor 對象中添加數據,比如添加一個布爾型數據就使用

putBoolean 方法,添加一個字符串則使用 putString()方法,以此類推。

3.    調用 commit()方法將添加的數據提交,從而完成數據存儲操作。 不知不覺中已經將理論知識介紹得挺多了,那我們就趕快通過一個例子來體驗一下

SharedPreferences 存儲的用法吧。新建一個 SharedPreferencesTest 項目,然后修改 activity_main.xml

中的代碼,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

 

<Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data"

/>

 

</LinearLayout>

這里我們不做任何復雜的功能,只是簡單地放置了一個按鈕,用於將一些數據存儲到

SharedPreferences 文件當中。然后修改 MainActivity 中的代碼,如下所示:

 

public class MainActivity extends Activity {

 

private Button saveData;

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

saveData = (Button) findViewById(R.id.save_data);

saveData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();

editor.putString("name", "Tom"); editor.putInt("age", 28); editor.putBoolean("married", false);

editor.commit();

}

});

}

 

}

可 以 看 到 , 這 里 首 先 給 按 鈕 注 冊 了 一 個 點 擊 事 件 , 然 后 在 點 擊 事 件 中 通 過 getSharedPreferences()方法指定 SharedPreferences 的文件名為 data,並得到了 SharedPreferences.Editor 對象。接着向這個對象中添加了三條不同類型的數據,最后調用 commit()方法進行提交,從 而完成了數據存儲的操作。

 

很簡單吧?現在就可以運行一下程序了,進入程序的主界面后,點擊一下 Save data 按鈕。這時的數據應該已經保存成功了,不過為了要證實一下,我們還是要借助 File Explorer 來進行查看。切換到 DDMS 視圖,並點擊 File Explorer 切換卡,然后進入到/data/data/com. example.sharedpreferencestest/shared_prefs /目錄下,可以看到生成了一個 data.xml 文件,如圖 6.6 所示。

 

圖   6.6

 

接下來同樣是點擊導出按鈕將這個文件導出到電腦上,並用記事本進行查看,里面的內 容如圖 6.7 所示。

 

圖   6.7

 

可以看到,我們剛剛在按鈕的點擊事件中添加的所有數據都已經成功保存下來了,並且SharedPreferences 文件是使用 XML 格式來對數據進行管理的。 那么接下來我們自然要看一看,如何從 SharedPreferences 文件中去讀取這些數據了。

 

 從 SharedPreferences 中讀取數據

你應該已經感覺到了,使用 SharedPreferences 來存儲數據是非常簡單的,不過下面還有 更好的消息,其實從 SharedPreferences 文件中讀取數據更加的簡單。SharedPreferences 對象 中提供了一系列的get 方法用於對存儲的數據進行讀取,每種get 方法都對應了SharedPreferences. Editor 中的一種 put 方法,比如讀取一個布爾型數據就使用 getBoolean()方法,讀取一個字符 串就使用 getString()方法。這些 get 方法都接收兩個參數,第一個參數是鍵,傳入存儲數據 時使用的鍵就可以得到相應的值了,第二個參數是默認值,即表示當傳入的鍵找不到對應的 值時,會以什么樣的默認值進行返回。

我們還是通過例子來實際體驗一下吧,仍然是在 SharedPreferencesTest 項目的基礎上繼 續開發,修改 activity_main.xml 中的代碼,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

<Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data"

/>

<Button android:id="@+id/restore_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Restore data"

/>

 

</LinearLayout>

這里增加了一個還原數據的按鈕,我們希望通過點擊這個按鈕來從 SharedPreferences 文 件中讀取數據。修改 MainActivity 中的代碼,如下所示:

 

public class MainActivity extends Activity {

 

private Button saveData;

 

private Button restoreData;

 

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

saveData = (Button) findViewById(R.id.save_data);

restoreData = (Button) findViewById(R.id.restore_data);

……

restoreData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SharedPreferences pref = getSharedPreferences("data",

 

MODE_PRIVATE);

 

 }

 

String name = pref.getString("name", "");

int age = pref.getInt("age", 0);

boolean married = pref.getBoolean("married", false); Log.d("MainActivity", "name is " + name); Log.d("MainActivity", "age is " + age); Log.d("MainActivity", "married is " + married);

 

});

}

 

}

可以看到,我們在還原數據按鈕的點擊事件中首先通過 getSharedPreferences()方法得到 了 SharedPreferences 對象,然后分別調用它的 getString()、getInt()和 getBoolean()方法去獲取 前面所存儲的姓名、年齡和是否已婚,如果沒有找到相應的值就會使用方法中傳入的默認值 來代替,最后通過 Log 將這些值打印出來。

現在重新運行一下程序,並點擊界面上的 Restore data 按鈕,然后查看 LogCat 中的打印 信息,如圖 6.8 所示。

 

圖   6.8

 

所有之前存儲的數據都成功讀取出來了!通過這個例子,我們就把 SharedPreferences 存儲的知識也學習完了。相比之下,SharedPreferences 存儲確實要比文本存儲簡單方便了許多, 應用場景也多了不少,比如很多應用程序中的偏好設置功能其實都使用到了 SharedPreferences 技術。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM