Android数据存储之SharedPreferences

来源:互联网 发布:mac版qq无法接收文件 编辑:程序博客网 时间:2024/06/06 23:16

           SharedPreferences是一种轻型的数据存储方式。我们和密码、位置信息等通常用它来保存一些软件的配置信息,例如,用户名等。其本质是以XML文件形式以键值对的形式来保存一些数据的。通常保存int 、String类型的数据。也可以保存一些复杂的数据,但是这些复杂的数据最终还是要转换成int 、String 类型的形式来保存。 复杂的数据我们也没有必要使用这种轻量级的数据存储方式了。我们直接使用数据库来存储了。接下来好好地认识一下吧。和以前一样我们给出官方的API   点击打开链接

          SharedPreferences的存储流程

(1)获取SharedPreferences对象
(2)获取SharedPreferences.Editor对象(因为SharedPreferencesd对象不能直接进行存储,存储实现通过Editor对象实现)
(3)通过Editor接口的putXxxx方法保存
(4)通过Editor.commit提交

          下面根据上面的步骤使用代码来看一下如何做

  //获取SharedPreferences对象        //SharedPreferences   pref=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);        SharedPreferences   pref=getSharedPreferences("my_pref", MODE_PRIVATE);        /**         * 第一个是调用PreferenceManager类中的getDefaultSharedPreferences()方法,而这个方法是静态的,接收一个Context参数,自动使用包名作为前缀命名第二个是调用Activity类中的getPerferences()方法,接收的是一个操作模式参数,文件名为活动名         */                Editor editor=pref.edit();        //存入数值        editor.putBoolean("booleanData", false);        editor.putFloat("floatData", (float) 11.11);        editor.putInt("intData", 20);        editor.putLong("longData", System.currentTimeMillis());        editor.putString("stringData", "fengdongdong");        //提交        editor.commit();
接下来得到保存的数据并在后台输出。默认值最好给出。

             getSharedPreferences("my_pref",MODE_PRIVATE);第二个参数怎么设置呢?有如下几种方式:


 //第一个参数为键,第二个参数为默认值        System.out.println(pref.getString("stringData", "默认值"));        System.out.println(pref.getLong("longData",(long) 0.0));        System.out.println(pref.getInt("intData", 0));        System.out.println(pref.getFloat("floatData", (float) 0.00));        System.out.println(pref.getBoolean("booleanData", true));
最后的显示结果


         数据改变时的监听事件:

    那当我们Sharedpreferences里面保存的数据改变了,我们如何去知道呢?官方还给出了一些监听事件

  

SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {            @Override            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {            }        };        sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注册数据变化监听        sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注册数据变化监听

 但是我们需要注意一些问题:我们注册的时候尽量在Activity的Resume里面去注册。在Activity的destory里面去解注册。

因为我们监听事件如果时间长了的话,系统会将监听器当做垃圾给回收掉。

      

         实例:保存用户名与密码

      先看一下布局

   

接下来给出逻辑代码

public class MainActivity1 extends Activity {private EditText et_username;private EditText et_password;private CheckBox check;private SharedPreferences   pref;private Editor editor;@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);super.onCreate(savedInstanceState);pref=getSharedPreferences("pres1", MODE_PRIVATE);editor=pref.edit();et_username=(EditText) findViewById(R.id.et_username);et_password=(EditText) findViewById(R.id.et_password);check=(CheckBox) findViewById(R.id.check_bt);//再次登录时首先拿到上次保存的信息String username=pref.getString("username", "");String password=pref.getString("password", "");if(username==null&&password==null){      //说明我们上次登录没有保存用户名和密码check.setChecked(false);}else{ //我们上次登录保存了信息check.setChecked(true);//将复选框勾上//将上次保存的信息显示在编辑框中et_username.setText(username);et_password.setText(password);}}//按钮的监听事件public void doClick(View view){String username=et_username.getText().toString().trim();String password=et_password.getText().toString().trim();//我们假设admin   123456表示登陆成功switch (view.getId()) {case R.id.login_bt:if("admin".equals(username)&&"123456".equals(password)){//我们登录时首先判断,是否要记住密码if(check.isChecked()){//当为记住密码时,现将这次登陆的用户名和密码保存起来editor.putString("username", username);editor.putString("password", password);editor.commit();Toast.makeText(MainActivity1.this,"保存了用户名与密码", Toast.LENGTH_SHORT).show();}else{//如果不需要保存,则将上次保存的信息也移除掉editor.remove("username");editor.remove("password");editor.commit();Toast.makeText(MainActivity1.this,"移除了用户名与密码", Toast.LENGTH_SHORT).show();}}else{//信息不匹配Toast.makeText(MainActivity1.this,"登录失败", Toast.LENGTH_SHORT).show();}break;}}}


1 0