使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferences的getXxx(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的使用
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 }
新建一个安卓项目,在res,layout,activity_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-----溺心与沉浮----博客园