美文网首页AndroidAndroid开发Android知识
06数据存储-SharedPreferences存储

06数据存储-SharedPreferences存储

作者: 何惧l | 来源:发表于2018-03-21 20:31 被阅读155次

    不同于文本的存储方式,SharedPreferences是使用键值对的方式来存储数据的,也就是当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值读取出来,而且这个还支持不同的数据类型存储

    将数据存储到SharedPreferences中

    要使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象,Android中提供了3种方法用来获取对象

    1. Context类中的getSharedPreferences()方法
      • 这个方法用于接收两个参数,第一个参数用于指定文件的名称,如果指定的文件不存在就会创建一个,文件都是存在与/data/data/<package name>/shared_prefs/目录下,第二个参数用于指定操作模式,只有MODE_PRIVTE这一种模式,是默认的操作,和直接传入0是同样的效果
    2. Activity类getPreferences()方法
      • 和第一个方法很相似,只不过它只接受一个操作模式参数,因为使用这个方法的时候会自动使用当前活动的类名作为SharedPreFerences的文件名
    3. PreferenceManager类中的getDefaultSharedPreferences()方法
      • 这是一个静态的方法,它接收一个Context参数,并自动使用房当前的应用程序的包名作为前缀来命名这个文件,
    4. 得到SharedPreferences对象后,就可以开始先SharedPreferences文件中存储数据了,可以分为3步
      • 调用SharePreferences对象的edit()方法获取一个SharePreferences.Editor对象
      • 向SharePreferences.Editor对象中添加数据,例:添加一个字符串就用putString()方法
      • 调用apply()方法将添加的数据进行提交,完成操作
    5. 在activity.xml中
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <Button
            android:id="@+id/but_data"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Save data"/>
    
    </LinearLayout>
    
    
    • 只放按钮用于将数据存到SharedPreferences文件中
    1. 在MainActivity中
    
    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            Button but = (Button)findViewById(R.id.but_data);
            but.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // 先获取SharedPreferences对象,文件名为data1
                    SharedPreferences.Editor editor = getSharedPreferences("data1",MODE_PRIVATE).edit();
                    // 是通过键值的方式来存数据的
                    editor.putString("name","pony007");
                    editor.putInt("age",28);
                    editor.apply();
                }
            });
        }
    }
    
    
    
    
    • 运行程序点击按钮
    • 点击这里 打开目录.png
    • 在这里看到数据


      数据.png
    • 打开数据是一个xml文件


      内容.png

    从SharedPreferences中读取数据

    SharedPreferences对象提供了一系列的get方法用于数据的读取,比如传入的是字符串,读取的时候就getString()就可以了,get方法是接收两个参数的,第一个参数是键,第二个参数是默认值,就是当传入的键找不到的时候会把这个默认值返回

    1. 修改activity中的代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <Button
            android:id="@+id/but_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Save data"/>
    
        <Button
            android:id="@+id/but_restore"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="REstore data"/>
    
    </LinearLayout>
    
    
    • 添加一个数据用于读取数据
    1. 在MainActivity中
    
    
    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
           Button but_restor = (Button)findViewById(R.id.but_restore);
            but_restor.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // 要读取的数据是哪一个文件
                    SharedPreferences pref = getSharedPreferences("data1",MODE_PRIVATE);
                    String name = pref.getString("name","");
                    int age = pref.getInt("age",0);
                    Log.d("aaaaaaaaa","name is"+name);
                    Log.d("aaaaaaaaa","age is"+age);
    
                }
            });
    
        }
    }
    
    
    
    • 运行程序,点击按钮


      控制台.png

    实现记住密码的功能

    1. 在activity_main.xml中设置一个简单的登陆界面
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <EditText
            android:id="@+id/edit_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户名"
            android:textSize="30sp"/>
        <EditText
            android:id="@+id/edit_pwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密码"
            android:inputType="numberPassword"
            android:textSize="30sp"
            />
    
        <CheckBox
            android:id="@+id/check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="是否记住密码"/>
    
        <Button
            android:id="@+id/but"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="25sp"
            android:text="登陆"/>
    
    </LinearLayout>
    
    
    • 这里有一个CheckBox,这是一个复选框,使用这个控件表示是否记住密码
    1. 在MainActivity中
    public class Main3Activity extends AppCompatActivity {
    
        private SharedPreferences pref;
        private SharedPreferences.Editor editor;
        private EditText nameEditl;
        private EditText pwdEdit;
        private Button login;
        //
        private CheckBox checkBox;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main3);
            //
            pref = PreferenceManager.getDefaultSharedPreferences(this);
            nameEditl = (EditText)findViewById(R.id.edit_name);
            pwdEdit = (EditText)findViewById(R.id.edit_pwd);
            checkBox = (CheckBox)findViewById(R.id.check);
            login = (Button)findViewById(R.id.but);
            //首先判断是否有这个值,若有就把用户名和密码设置里面,若没有就执行下面的
            // 当然了刚开始执行肯定没有,就是false
            boolean isRemember = pref.getBoolean("remember_pwd",false);
            if (isRemember){
                // 将账号和密码都设置到文本框中
                String name = pref.getString("name","");
                String pwd = pref.getString("pwd","");
                nameEditl.setText(name);
                pwdEdit.setText(pwd);
                // 复选框设置为true
                checkBox.setChecked(true);
            }
    
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String name = nameEditl.getText().toString();
                    String pwd = pwdEdit.getText().toString();
                    // 首先判断密码和账号是否正确
                    if (name.equals("pony007")&& pwd.equals("123456")){
                        editor = pref.edit();
                        // 首先判断这个复选框是否选中,如果用户想要记住密码就执行下面的用于储存
                        if(checkBox.isChecked()){
                            // 这个值用于判断是否首次存储过
                            editor.putBoolean("remember_pwd",true);
                            editor.putString("name",name);
                            editor.putString("pwd",pwd);
                        }else{
                            // 若没有选择复选框,那么就把文件中的数据全部清除掉
                            editor.clear();
                        }
                        //记得这一步
                        editor.apply();
                        //登陆成功后跳转的页面
                        Intent intent = new Intent(Main3Activity.this,Main4Activity.class);
                        startActivity(intent);
                        finish();
                    }else {
                        Toast.makeText(Main3Activity.this,"用户名或者密码输入错误",Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
    
    
    
    • 首先在onCreate()方法中获取到了SharedPreferences对象,然后调用getBoolean()方法获取remember_pwd这个键的值,一开始这个值就根本不存在,就会使用默认的false
    • 在登陆成功后,会调用checkBox的isChecked()方法用于判断复选框是否被选中,若选中,那么就把remember_pwd这只为true,再把对应的密码和用户名存进去,并提交,若没有选中,就调用clea()方法,将文件中是的数据清除掉
    • 运行程序,填写密码和用户名,勾选复选框,点击登陆,


      登陆.png
    • 登陆成功后点击Back键退出,再点击这个app
      第二次界面.png
      此时你会发现密码和用户名和复选框都是默认有的
    • 若此时去掉复选框,点击登陆,然后再退出,再点击app运行,此时


      第三次界面.png

      还得要重新的输入用户名和密码

    1. 需要注意的是,这只是一个简单的例子,并不能在项目中使用,因为将密码以明文的形式存储在SharedPreferences文件中是非常不安全的,在项目中还要结合一定的加密算法进行保护才行

    相关文章

      网友评论

        本文标题:06数据存储-SharedPreferences存储

        本文链接:https://www.haomeiwen.com/subject/nuenqftx.html