Android开发中的SharedPreferences

          在Android开发app过程中,总会有需要存储较多的一些琐碎东西,比如存储CheckBox是否勾选结果,存储临时文件与数据,数据量比较少,但是名目多。这样使用数据库就很麻烦,而且有一种杀鸡用牛刀的感觉。对于这种数据比较好的一种存储方式就是利用SharedPreferences对数据进行存储。也是在开发过程中使用的较为频繁的一种操作。这次文章所描述的就是利用SharedPreferences来对数据进行一定的存储,读取,删除。亲测有效,写这篇文章一是为以后自己使用的时候提供可行参考,二是与各位看官交流,我就是一个新手,于Android开发中就是个小学生,望高手不奢赐教。

简单的说,对于SharedPreferences

存取数据核心代码:

SharedPreferences sp= getSharedPreferences("config",MODE_PRIVATE);//获取实例
SharedPreferences.Editor editor= sp.edit();//获取编辑器
editor.putString("name",name);//存数据
editor.putString("pwd",password);
editor.commit();

读取代码核心代码:

SharedPreferences sharedPreferences=getSharedPreferences("config",MODE_PRIVATE);
String NAME= sharedPreferences.getString("name","");//前一个参数为key值,后一个参数为默认值
String PWD= sharedPreferences.getString("pwd","");
user.setText(NAME);
pass.setText(PWD);

如果只是想知道 SharedPreferences如何使用的看官,到此便可。生成的config.xml文件位于data/data/包名/shared_prefs下面。

以下是我做的一个简单的案例,也总结了一些最近学习的思考,希望看到后面的看官能够多多交流,相互促进嘛。谢谢。

废话不多说,我的开发环境是Android studio3.1。利用真机进行验证结果,真机魅族mx4,(Android 5.1 ,API22)。

Android开发中的SharedPreferences

为了简洁操作演示,界面写的比较简单,如图:

Android开发中的SharedPreferences

具体如何布局就不啰嗦了,应该都清楚,有很多布局方案。建议不管app开发简单与否,命名一定要有条理,这个习惯很重要,其一,为之后的开发提供一定的便利性;其二,实际开发过程中代码工程量会很大,而且是合作开发,多为伙伴着想。磨刀不误砍柴工嘛。我一般的命名习惯也是看了一些大神的规则改过来的,如下利用下划线进行不同部分划分:

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="记录text文件"
        android:inputType="text"
        android:id="@+id/et_text"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="提交"
            android:id="@+id/bt_sumbit_text"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="删除"
            android:id="@+id/bt_delete_text"/>
    </LinearLayout>

布局结束就到了绑定控件的时候了,其实开发app说简单也简单,说白了就是三步走,一、布局;二、绑定控件;三、逻辑书写;

在这里开发的过程中有一个小技巧,当控件较多的时候,控件名称太多为减少来回翻看的麻烦,可进行如下操作:

Android开发中的SharedPreferences

点击这个split就好,就会得到如下结果:

Android开发中的SharedPreferences

绑定控件便可,小技巧:oncreat方法最好精简,不要什么方法一股脑写在里面,虽然这对电脑来说无差别,但是可阅读性太差。 

绑定如下:

public class MainActivity extends AppCompatActivity {
    private EditText et_text;
    private EditText et_int;
    private Button bt_sumbit_text;
    private Button bt_delete_text;
    private Button bt_sumbit_int;
    private Button bt_delete_int;
    private CheckBox cb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
    }

    private void initUI() {
        et_text=(EditText)findViewById(R.id.et_text);
        et_int=(EditText)findViewById(R.id.et_int);
        bt_sumbit_int=(Button)findViewById(R.id.bt_sumbit_int);
        bt_delete_int=(Button)findViewById(R.id.bt_delete_int);
        bt_sumbit_text=(Button)findViewById(R.id.bt_sumbit_text);
        bt_delete_text=(Button)findViewById(R.id.bt_delete_int);
        cb=(CheckBox)findViewById(R.id.cb);
    }
}

建议,虽然本案例中所牵扯的控件以及逻辑不是很复杂,但是笔者上文说到,代码要力求条理性以及简洁性;在较为复杂的app开发中对于读取 操作临时存储数据有时是很频繁的,所以为追求简洁性,创建class文件整合SharedPreferences所需所有操作。如下只是对应该案例的例子:

public class SpUtil {
    private static SharedPreferences sp;

    /**
     * @param context 山下文
     * @param key 提示信息
     * @param string 存储值
     *               存取string值
     */
    public static void putString(Context context,String key,String string){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
        }
        sp.edit().putString(key,string).commit();
    }

    /**
     * @param context
     * @param key
     * @param string 默认值
     */
    public static String getString(Context context,String key,String string){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
        }
      return sp.getString(key,string);
    }

    /**
     * @param context
     * @param key
     * @param i 输入int值
     */
    public static void putInt(Context context,String key,int i){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
        }
        sp.edit().putInt(key,i).commit();
    }

    /**
     * @param context
     * @param key
     * @param i 默认值
     * @return
     */
    public static int getInt(Context context,String key,int i){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
        }
        return sp.getInt(key,i);
    }

    /**
     * @param context
     * @param key
     * @param b 需保存值
     */
    public static void putBoolean(Context context,String key,boolean b){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);//设置config.xml文件,权限为私有
        }
        sp.edit().putBoolean(key,b).commit();
    }

    /**
     * @param context
     * @param key
     * @param b 默认Boolean值
     * @return
     */
    public static boolean getBoolean(Context context,String key,boolean b){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
        }
        return sp.getBoolean(key,b);
    }
    public static void Remove(Context context,String key){
        if (sp==null){
            sp=context.getSharedPreferences("config",Context.MODE_PRIVATE);
        }
        sp.edit().remove(key).commit();
    }
}

同时为了规划化代码命名,也是为了代码的可读性,再设置class文件进行命名管理:

public class Keyname {
    public final static String EDTEXT="edtext";//存储text
    public final static String EDINT="edint";//存储int
    public final static String CBISCHECK="cbischeck";//存储check值
}

 至此前期准备已经全部准备完毕,就可以进行第三步的逻辑操作了:

首先是数据读取并初始化:

 private void initData() {
        String ettext = SpUtil.getString(getApplicationContext(), Keyname.EDTEXT, "");
        int etint = SpUtil.getInt(getApplicationContext(), Keyname.EDINT, 0);
        boolean cbischeck = SpUtil.getBoolean(getApplicationContext(), Keyname.CBISCHECK, false);
        et_text.setText(ettext);
        et_int.setText(etint+"");
        cb.setChecked(cbischeck);
    }

而后对数据进行存取操作:

@Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_sumbit_text:
                String ettext = et_text.getText().toString().trim();
                SpUtil.putString(getApplicationContext(),Keyname.EDTEXT,ettext);
                break;
            case R.id.bt_delete_text:
                SpUtil.Remove(getApplicationContext(),Keyname.EDTEXT);
                break;
            case R.id.bt_sumbit_int:
                String etint = et_int.getText().toString().trim();
                int i = Integer.parseInt(etint);
                SpUtil.putInt(getApplicationContext(),Keyname.EDINT,i);
                break;
            case R.id.bt_delete_int:
                SpUtil.Remove(getApplicationContext(),Keyname.EDINT);
                break;
        }
    }

 

cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                SpUtil.putBoolean(getApplicationContext(),Keyname.CBISCHECK,b);
            }
        });

至此案例完工,这样退出程序,下次竟然程序的时候也会存储上次操作。main代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private EditText et_text;
    private EditText et_int;
    private Button bt_sumbit_text;
    private Button bt_delete_text;
    private Button bt_sumbit_int;
    private Button bt_delete_int;
    private CheckBox cb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
        initData();
    }


    private void initData() {
        String ettext = SpUtil.getString(getApplicationContext(), Keyname.EDTEXT, "");
        int etint = SpUtil.getInt(getApplicationContext(), Keyname.EDINT, 0);
        boolean cbischeck = SpUtil.getBoolean(getApplicationContext(), Keyname.CBISCHECK, false);
        et_text.setText(ettext);
        et_int.setText(etint+"");
        cb.setChecked(cbischeck);
    }

    private void initUI() {
        et_text=(EditText)findViewById(R.id.et_text);
        et_int=(EditText)findViewById(R.id.et_int);
        bt_sumbit_int=(Button)findViewById(R.id.bt_sumbit_int);
        bt_delete_int=(Button)findViewById(R.id.bt_delete_int);
        bt_sumbit_text=(Button)findViewById(R.id.bt_sumbit_text);
        bt_delete_text=(Button)findViewById(R.id.bt_delete_text);
        cb=(CheckBox)findViewById(R.id.cb);

        bt_sumbit_text.setOnClickListener(this);
        bt_delete_text.setOnClickListener(this);
        bt_sumbit_int.setOnClickListener(this);
        bt_delete_int.setOnClickListener(this);

        cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                SpUtil.putBoolean(getApplicationContext(),Keyname.CBISCHECK,b);
            }
        });

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_sumbit_text:
                String ettext = et_text.getText().toString().trim();
                SpUtil.putString(getApplicationContext(),Keyname.EDTEXT,ettext);
                break;
            case R.id.bt_delete_text:
                SpUtil.Remove(getApplicationContext(),Keyname.EDTEXT);
                break;
            case R.id.bt_sumbit_int:
                String etint = et_int.getText().toString().trim();
                int i = Integer.parseInt(etint);
                SpUtil.putInt(getApplicationContext(),Keyname.EDINT,i);
                break;
            case R.id.bt_delete_int:
                SpUtil.Remove(getApplicationContext(),Keyname.EDINT);
                break;
        }
    }
}

当然,不一定要使用button进行数据提交,edittext有自己的监听器:

et_text.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

还有:

et_text.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                return false;
            }
        });

用法下次再聊。

对了其生成的xml文件如此data/data下:

Android开发中的SharedPreferences

Android开发中的SharedPreferences

总结:

1、Android开发命名规则习惯很重要

2、Android开发代码需注重条理性

3、Android开发需注重简洁性