Android基础之数据存储(SharedPreference)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cornerOfHeart/article/details/82823367

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


 

猜你喜欢

转载自blog.csdn.net/cornerOfHeart/article/details/82823367
今日推荐