1. 程式人生 > >Android基礎之資料儲存(SharedPreference)

Android基礎之資料儲存(SharedPreference)

Android資料持久化是說在斷電後資料不會丟失,而根據儲存位置和實現方式一般有3種方式,這裡說sharedpreferences: 一,sharedpreferences儲存 該種方式是在應用獨有目錄data/data/[packgename]/shared_prefs/下生成相應的preferences檔案儲存資料。 儲存的是鍵值對資料,所以比較適合用於儲存設定,密碼等資料。 API: 1,檔案獲取、建立 PreferenceManager.getDefaultSharedPreferences(Context context); //返回以包名命名的preferences,首次呼叫時沒有檔案就建立 Activity.this.getPreferences(MODE_PRIVATE);//返回以Activity名命名的preferences,首次呼叫時沒有檔案就建立 Context.getSharedPreferences("name",MODE_PRIVATE);//返回以name名命名的preferences,首次呼叫時沒有檔案就建立

2,資料獲取: defaultpreference.getBoolean("remember_pw",false); defaultpreference.getString("account","");

3,資料新增,修改,移除  SharedPreferences.Editor editor=defaultpreference.edit();  editor.putString("account",account);  editor.putString("password",password);  editor.putBoolean("remember_pw",true);  editor.remove("accouint");//移除某個鍵值對  editor.clear();//移除所有資料  editor.commit();

二,Preferences控制元件 以上是preferences的基礎,實際使用過程中android提供了一系列封裝了preferences的控制元件,自動生成packagename_preferencse.xml,自動儲存這些資料,並立時生效。 1,常用Preferences控制元件 PreferenceScreen  //所有Preference元素的根節點,如果巢狀,點選後出現一個新的螢幕 PreferenceCategory //用於組合一組Preference,使佈局看起來具有層次關係,美觀 ListPreference //顯示一個相當的list,點選item選中儲存對應value CheckBoxPreference //相當於checkBox EditTextPreference //等同於EditText,點選彈出對話方塊,編輯儲存

2,控制元件屬性 通用: android:key                 這個屬性相當於android:id的作用。用此key來唯一表示此Preference android:title                Preference的標題, android:summary        表示Preference提示語,相對於android:title來說顯示要小點,而且顯示位置在android:title下面 android:defaultValue  這個表示的是預設值,比如CheclPreference這種preference就可以指定預設是"true"還是“false” android:enabled         表示該Preference是否可用狀態 特有: ListPreference     <ListPreference          android:key="list"         android:title="Options"         android:entries="@array/entry_list"                             android:entryValues="@array/values_list"         android:dialogTitle="list dialogtitle"         android:defaultValue="1"         />

CheckBoxPreference     <CheckBoxPreference          android:key="checkbox_one"         android:title="checbox_one"         android:summaryOn="On_check_one"         android:summaryOff="offcheck_one"         />

3,控制元件獲取,點選,監聽 Activity不是繼承Activity,而是PreferenceActivity; 不是使用setContentView()方法,而是使用addPreferencesFromResource()方法來載入佈局檔案; 佈局檔案一般新增在res/xml下面,以PreferenceScreen為根元素的xml檔案; 與一般Activity一樣在AndroidManifest中註冊。 獲取控制元件: mCheck=(CheckBoxPreference) findPreference("checkbox"); mRing=(RingtonePreference) findPreference("ring"); 點選,監聽: 對PreferenceActivity監聽可以重寫onPreferenceTreeClick() 對Preference控制元件可以註冊OnPreferenceChangeListener和OnPreferenceClickListener

那麼這三個點選事件在一起是什麼用的呢?它的規則如下: 點選某個Preference控制元件後,會先回調onPreferenceChange()方法,即是否儲存值,這裡在實際使用中就會有一些使用處理。 然後再回調onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我們得到的就是儲存與否之後的,也就是最新的Preference控制元件值。 然後onPreferenceClick會比onPreferenceTreeClick()方法先呼叫,如果onPreferenceClick方法返回true,那就不會再呼叫onPreferenceTreeClick()方法, 如果onPreferenceClick()返回false就會繼續呼叫onPreferenceTreeClick()方法。 下面是程式碼和log例項。

public class ItChqActivity extends PreferenceActivity {     private static String TAG="ItChqActivity";

    @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         Log.d(TAG,"oonCreate");         addPreferencesFromResource(R.xml.prftest);

        CheckBoxPreference preference=(CheckBoxPreference)findPreference("checkbox");         preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {             @Override             public boolean onPreferenceChange(Preference preference, Object newValue) {                 Log.d(TAG,"onPreferenceChange() newValuew="+newValue);                 return true;             }         });

        preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {             @Override             public boolean onPreferenceClick(Preference preference) {                 Log.d(TAG,"onPreferenceClick preference.Valuew="+PreferenceManager.getDefaultSharedPreferences(ItChqActivity.this).getBoolean(preference.getKey(),false));                 return true;             }         });     }     @Override     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {         Log.d(TAG,"onPreferenceTreeClick()");         if(preference.getKey().equals("checkbox")){             Log.i("itchq", "checkbox");         }         return true;     }

}

1,OnPreferenceChangeListener return true 09-23 08:37:24.904 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false 09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()

2,OnPreferenceChangeListener return false 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=true 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()

3,onPreferenceClick  return true 09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false