Android 數據存儲 (一)SharedPreferences

轉載請註明出處: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的簡單用法。其中還有一些坑需要去走。

歡迎掃一掃關注我的微信公衆號,定期推送優質技術文章:

這裏寫圖片描述

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