reverse_xiaoyu

忘记并不可怕,可怕的是你从来就都不知道!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferencesgetXxx(name), 就可以根据键获得对应的值!使用起来很方便!

 

  SharedPreferences是一种轻型的Android数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。比较经典的使用方式例如用户输入框对过往登录账户的存储。实现SharedPreferences存储的步骤如下:

 

1、根据Context获取SharedPreferences对象
2、利用edit()方法获取Editor对象。
3、通过Editor对象存储key-value键值对数据。
4、通过apply()方法提交数据。

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者By-----溺心与沉浮----博客园

SharedPreferences的使用

  SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中;

 1 1)写入数据:
 2      //步骤1:创建一个SharedPreferences对象
 3      SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
 4      //步骤2: 实例化SharedPreferences.Editor对象
 5      SharedPreferences.Editor editor = sharedPreferences.edit();
 6      //步骤3:将获取过来的值放入文件
 7      editor.putString("name", “Tom”);
 8      editor.putInt("age", 28);
 9      editor.putBoolean("marrid",false);
10      //步骤4:提交               
11      editor.commit();(apply())
12 
13  2)读取数据:
14      SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
15      String userId=sharedPreferences.getString("name","");
16   
17 3)删除指定数据
18      editor.remove("name");
19      editor.commit();
20 
21 4)清空数据
22      editor.clear();
23      editor.commit();(apply())

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者By-----溺心与沉浮----博客园 

 

注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences的初始化,否则会报空指针 即 getActivity()会可能返回null

读写其他应用的SharedPreferences 步骤如下(未实践):
 1. 在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取;
 2. 创建其他应用程序对应的Context
 3. 使用其他程序的Context获取对应的SharedPreferences
 4. 如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致;

 1 * SharedPreferences数据的四种操作模式:
 2      * 一、Context.MODE_PRIVATE
 3      * 二、Context.MODE_APPEND
 4      * 三、Context.MODE_WORLD_READABLE
 5      * 四、Context.MODE_WORLD_WRITEABLE
 6      *
 7      * Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
 8      * Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
 9      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
10      *
11      * MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
12      * MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
13      *
14      * 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用

 

 1 try {
 2 //这里的com.example.mpreferences 就是应用的包名
 3  Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY);
 4 
 5  SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
 6  int count = msharedpreferences.getInt("count", 0);
 7 
 8  } catch (PackageManager.NameNotFoundException e) {
 9        e.printStackTrace();
10  }

 

 

  新建一个安卓项目,在reslayoutactivity_main.xml添加代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户登录"/>
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="请输入用户名"/>
    <EditText
            android:id="@+id/editUserName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户名"/>
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="请输入密码"/>
    <EditText
            android:id="@+id/editUserPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密码"/>
    <Button
            android:id="@+id/button_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登陆"/>
</LinearLayout>

效果如下:

 

 简单的SharedPreferences工具类编写SharedPreferences.java

 1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import android.content.Context;
 4 import android.content.SharedPreferences;
 5 import android.widget.Toast;
 6 
 7 import java.util.HashMap;
 8 import java.util.Map;
 9 
10 public class SharedHelp {
11     private Context context;
12 
13     public SharedHelp(){
14 
15     }
16 
17     public SharedHelp(Context context){
18         this.context = context;
19     }
20 
21     public void save(String userName, String passWord){
22         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
23         SharedPreferences.Editor editor = sp.edit();
24         editor.putString("userName", userName);
25         editor.putString("passWord", passWord);
26         editor.apply();
27         Toast.makeText(context, "信息已写入SharedPreferences中", Toast.LENGTH_SHORT).show();
28     }
29 
30     public Map<String, String> read(){
31         Map<String, String> data = new HashMap<String, String>();
32         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
33         data.put("userName", sp.getString("userName", ""));
34         data.put("passWord", sp.getString("passWord", ""));
35         return data;
36     }
37 }

 

 在MainActivity中实现逻辑

 1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.view.View;
 8 import android.widget.Button;
 9 import android.widget.EditText;
10 
11 import java.util.Map;
12 
13 public class MainActivity extends AppCompatActivity {
14     //实例化layout中EditText的editUserNmae
15     private EditText editUserName;
16     //实例化layout中EditText的editUserPassword
17     private EditText editUserPassword;
18     //实例化layout中Button的button_login
19     private Button button_login;
20     //定义上下文
21     private Context context;
22     //定义ShareHelp类的对象
23     private SharedHelp sharedHelp;
24     //定义两个字符串名
25     private String strName;
26     private String strPassword;
27 
28     @Override
29     protected void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.activity_main);
32         //获取上下文
33         context = getApplicationContext();
34         sharedHelp = new SharedHelp();
35         bindViews();
36     }
37 
38     private void bindViews(){
39         //实例化的变量绑定相应的ID
40         editUserName = findViewById(R.id.editUserName);
41         editUserPassword = findViewById(R.id.editUserPassword);
42         button_login = findViewById(R.id.button_login);
43         //为按钮设置监听事件
44         button_login.setOnClickListener(new View.OnClickListener() {
45             @Override
46             public void onClick(View view) {
47                 //当按钮被按下触发时,从控件中getText()并将其转换成字符串
48                 strName = editUserName.getText().toString();
49                 strPassword = editUserPassword.getText().toString();
50                 //通过SharedHelp类中save方法,将其保存
51                 sharedHelp.save(strName, strPassword);
52             }
53         });
54     }
55 
56     @Override
57     protected void onStart() {
58         super.onStart();
59         //定义一个Map<String, String>类型的变量data用来接收shareHelp.read()方法的返回值
60         Map<String, String> data = sharedHelp.read();
61         //将获取到的数据放置到两个EditText中
62         editUserName.setText(data.get("userName"));
63         editUserPassword.setText(data.get("passWord"));
64     }
65 }

 

 本人十分不建议代码在主程序入口处写,建议另起文件写,方便交流,就在MainActivity中写了

 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者By-----溺心与沉浮----博客园

 

 最后再写一个SharedPreferences的工具集类

 SharedPreferencesUtillty.java

  1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
  2 
  3 import android.content.Context;
  4 import android.content.SharedPreferences;
  5 
  6 import java.util.Map;
  7 
  8 public class SharedPreferenceUtillty {
  9     //保存的SP文件名
 10     public static final String FILE_NAME = "MyMap";
 11 
 12     /**
 13      * SharedPreferences数据的四种操作模式:
 14      * 一、Context.MODE_PRIVATE
 15      * 二、Context.MODE_APPEND
 16      * 三、Context.MODE_WORLD_READABLE
 17      * 四、Context.MODE_WORLD_WRITEABLE
 18      *
 19      * Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
 20      * Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
 21      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
 22      *
 23      * MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
 24      * MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
 25      *
 26      * 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用
 27      */
 28 
 29     /**
 30      * 保存数据
 31      */
 32     public static void putData(Context context, String key, Object object){
 33         //实例化SharedPreferences对象(第一步)
 34         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
 35         //实例化SharedPreferences.Editor对象(第二步)
 36         SharedPreferences.Editor editor = sp.edit();
 37         //用putObject的方法保存数据,取决于第三个参数你使用的什么类型的变量
 38         if (object instanceof Boolean){
 39             editor.putBoolean(key, (Boolean) object);
 40         }else if (object instanceof Float){
 41             editor.putFloat(key, (Float) object);
 42         }else if (object instanceof Integer){
 43             editor.putInt(key, (Integer) object);
 44         }else if (object instanceof Long){
 45             editor.putLong(key, (Long) object);
 46         }else if (object instanceof String){
 47             editor.putString(key, (String) object);
 48         }
 49         editor.apply();
 50     }
 51 
 52     /**
 53      * 获取指定数据
 54      */
 55     public static Object getData(Context context, String key, Object object){
 56         //实例化SharedPreferences对象(第一步)
 57         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
 58         //用getObject的方法保存数据,取决于第三个参数你使用的什么类型的变量(第二步)
 59         if (object instanceof Boolean){
 60             return sp.getBoolean(key, (Boolean) object);
 61         }else if (object instanceof Float){
 62             return sp.getFloat(key, (Float) object);
 63         }else if (object instanceof Integer){
 64             return sp.getInt(key, (Integer) object);
 65         }else if (object instanceof Long){
 66             return sp.getLong(key, (Long) object);
 67         }else if (object instanceof String){
 68             return sp.getString(key, (String) object);
 69         }
 70         return null;
 71     }
 72 
 73     /**
 74      * 返回所有的键值对
 75      */
 76     public static Map<String, ?> getAll(Context context){
 77         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 78         Map<String, ?> map = sp.getAll();
 79         return map;
 80     }
 81 
 82     /**
 83      * 检查对应的数据是否存在
 84      */
 85     public static boolean contains(Context context, String key){
 86         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 87         return sp.contains(key);
 88     }
 89 
 90     /**
 91      * 删除指定key值的数据
 92      */
 93     public static void remove(Context context, String key){
 94         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 95         SharedPreferences.Editor editor = sp.edit();
 96         editor.remove(key);
 97         editor.apply();
 98     }
 99 
100     /**
101      * 删除所有的数据
102      */
103     public static void clear(Context context, String key){
104         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
105         SharedPreferences.Editor editor = sp.edit();
106         editor.clear();
107         editor.apply();
108     }
109 
110 }

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者By-----溺心与沉浮----博客园

 

posted on 2019-08-28 17:43  Reverse-xiaoyu  阅读(613)  评论(0编辑  收藏  举报