轉載請註明出處:http://blog.csdn.net/vnanyesheshou/article/details/73777334
本文已授權微信公衆號 fanfan程序媛 獨家發佈 掃一掃文章底部的二維碼或在微信搜索 fanfan程序媛 即可關注
這篇主要簡單介紹一下Android中存儲數據的幾種方式,然後具體分析下SharedPreferences的使用方法。
1 簡介 |
Android提供了幾個選項來保存持久的應用程序數據。 您選擇的解決方案取決於您的具體需求,例如數據是否應該是您的應用程序私有的或其他應用程序(和用戶)可訪問的數據以及數據所需的空間。
數據存儲選項如下:
- Shared Preferences 保存私人基本數據(鍵值對)。
- Internal Storage 將專有數據存儲在設備內存中。
- External Storage 將公共數據存儲在共享的外部存儲上。
- SQLite Databases 將結構化數據存儲在專用數據庫中。
- Network Connection 使用自己的網絡服務器將數據存儲在網絡上。
Android提供了一種讓您將私人數據暴露給其他應用程序的方式 - ContetProvider。ContetProvider是一個可選組件,可以暴露對應用程序數據的讀/寫訪問權限,無論您想要施加什麼限制。
這篇主要說一下SharedPreferences使用方法。
SharedPreferences是Android提供的一種存儲數據的機制,用於存儲少量數據,數據類型包括(boolean 、int、long、float、string),主要用於存儲應用的配置信息,例如:用戶名、密碼、是否開啓震動、音樂等。
它實際上是以鍵值對的形式儲存在xml文件中。存儲位置:data/data/程序包名/shared_prefs/ 目錄下。
2 保存數據 |
先看下代碼:
mPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
mEditor = mPreferences.edit();
mEditor.putInt("int", 1);
mEditor.putBoolean("boolean", true);
mEditor.putFloat("float", 3.14f);
mEditor.putLong("long", 123l);
mEditor.putString("string", "abcd");
mEditor.commit();
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
第1行 通過context獲取SharedPreferences對象SharedPreferences
第一個參數表示要操作的xml文件名。
第二個參數 操作模式,操作模式如下:Context類中的變量,類型爲public static final int。
- MODE_PRIVATE = 0x0000; 0 默認模式,指定該SharedPreferences數據只能被本應用程序讀、寫。
- MODE_WORLD_READABLE = 0x0001; 1 指定數據可以被其他應用程序讀,但不能寫。
創建可讀的文件是很危險的,而且可能以引起應用程序的安全漏洞。強烈勸阻;相反,應用程序應該使用的互動更加正式的機制 如{ContentProvider},{BroadcastReceiver}和{android.app.Service}。此變量在API級別17中已被棄用。 - MODE_WORLD_WRITEABLE = 0x0002; 2 指定數據可以被其他應用程序寫,但不能讀。
創建可寫文件也是危險的,不推薦使用。此變量在API級別17中已被棄用。 - MODE_MULTI_PROCESS = 0x0004; 4 文件將會在SharedPreference實例被裝載到進程的時候檢查是否被修改,主要用在一個應用有多個進程的情況。
第2行 獲取Editor對象,通過editor對象來更改SharedPreferences中的內容。
第3~7行 設置鍵值對。
第8行 提交修改。(很重要,如果不執行則並沒有更改數據)。
查看下Editor的一些方法:
以put開頭的是設置鍵值對的方法。rmove方法用來移除某鍵值對。
apply() 和commit()都可以用來保存修改。
- commit()有返回值,成功返回true,失敗返回false。將內容修改從編輯器提交到SharedPreferences對象,這是原子到執行修改,替換當前在SharedPreferences中的任何內容。注意:當兩個編輯器同時修改內容時,最後一個調用提交覆蓋之前的更改。如果不關心返回值,並且從應用程序的主線程中使用該值,請考慮使用apply()。return 如果返回true,則表示將新值寫入持久存儲(硬件磁盤)成功,否則表示寫入失敗。
- apply()沒有返回值,apply()是將修改的數據提交到內存, 而後異步真正的提交到硬件磁盤,不會通知任何失敗。
如果SharedPreferences的另一個編輯器editor在apply異步提交傷胃完成時定期進行commit,則commit將阻塞,直到所有異步提交完成。
由於SharedPreferences在一個進程中是單列的,如果忽略了返回值,可以安全的替換任何commit 到apply。
我這個代碼包名是cn.vn.sharedpreferencesdemo,所以xml文件路徑爲:/data/data/cn.vn.sharedpreferencesdemo/shared_prefs/test.xml。
內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="boolean" value="true" />
<long name="long" value="123" />
<float name="float" value="3.14" />
<int name="int" value="1" />
<string name="string">abcd</string>
</map>
3 獲取數據 |
代碼如下:
int a = mPreferences.getInt("int", 0);
boolean bool = mPreferences.getBoolean("boolean", false);
float f = mPreferences.getFloat("float", 0.0f);
long l = mPreferences.getLong("long", 0);
String s = mPreferences.getString("string", "");
String wifi = mPreferences.getString("wifi", "5566");
變量值如下:
06-27 11:55:42.328 I/MainActivity( 2408): a=1
06-27 11:55:42.328 I/MainActivity( 2408): bool=true
06-27 11:55:42.328 I/MainActivity( 2408): f=3.14
06-27 11:55:42.328 I/MainActivity( 2408): l=123
06-27 11:55:42.328 I/MainActivity( 2408): s=abcd
06-27 11:55:42.328 I/MainActivity( 2408): wifi=5566
以getInt爲例,第一個參數爲鍵值,第二個參數爲默認值(如果SharedPreferences中沒有該鍵值則返回該值)。其他道理類似。
4 監聽數據改變 |
SharedPreferences類中提供了監聽數據變化的接口,代碼如下
private OnSharedPreferenceChangeListener mListener=
new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.i(TAG, "Changed key="+key);
}
};
//註冊監聽
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
當SharedPreferences中的數據修改後,會回調mListener中的onSharedPreferenceChanged方法,通過參數key可以知道哪個鍵值進行了變動。
我們來嘗試修改一下:
mEditor.putInt("int", 1);
mEditor.putString("string", "ab");
mEditor.remove("long");
mEditor.commit();
打印如下:
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=string
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=long
由於原先的int鍵對應的值爲1,該值沒有改變,所以不會回調onSharedPreferenceChanged。而string鍵的值由abcd變成了ab,刪除了long鍵,所以這兩個鍵更改都有回調。
取消監聽SharedPreference
mPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
demo下載地址:http://download.csdn.net/detail/vnanyesheshou/9881881
以上就是SharedPreferences的簡單用法。其中還有一些坑需要去走。
歡迎掃一掃關注我的微信公衆號,定期推送優質技術文章: