暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Android中的数据存取 | SharedPreferences保存用户名和密码

668

在 上一篇 中“欢乐购商城”的登录页面使用了文件存储的方式实现了,但是在实际应用中,通常采用SharedPreferences类进行存储。


分析

在登录页面上实现保存用户名和密码的功能,可以采用SharedPreferences类,SharedPreferences类很适合保存用户名、密码之类的简单配置信息,如图7-9所示。

■ 图7-9登录页面


通常用户在使用Android应用时,都会根据自己的爱好进行简单的设置,例如,设置背景颜色、记录用户名和密码、登录状态等,为了使用户下次打开应用时不需要重复设置,应用程序需要保存这些设置信息。Android提供了一个SharedPreferences接口,来保存配置参数。应用程序使用SharedPreferences接口可以快速而高效地以键值对的形式保存数据,信息以XML文件的形式存储在Android设备上。SharedPreferences本身是一个接口,不能直接实例化,但Android的Context类提供了方法可以获取SharedPreferences实例。


1

SharedPreferences数据操作


1

使用SharedPreferences存储数据

使用SharedPreferences类存储数据时,首先需要调用getSharedPreferences(String name,int mode)方法获取实例对象。在该方法中需要传递两个参数,第一个参数表示保存信息的文件名,不需要后缀,在同一个应用中可以使用多个文件保存不同的信息;第二个参数表示SharedPreferenes的访问权限,和7.1节中读取应用程序的文件类似,包括只能被本应用程序读、写和能被其他应用程序读写。由于该对象本身只能获取数据,不能对数据进行存储和修改,因此需要调用 SharedPreferences类的edit()方法获取可编辑的Editor对象,最后通过该对象的putXXX()方法存储数据,示例代码如下。

1  SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
2  SharedPreferences.Editor editor = preferences.edit();
3  editor.putString("name", "James");
4  editor.putInt("age", 25);
5  editor.commit();

复制


上述代码中,第1行代码通过getSharedPreferences()获取SharedPreferences 对象,之后通过该对象的edit()方法获取Editor对象并通过相应的方法存储数据,最后通过commit()方法提交。通过上述代码,Editor对象是以key/value的形式保存数据的,其中value值只能是float、int、long、boolean、String、Set类型数据。并且根据数据类型的不同,会调用不同的方法。需要注意的是,最后一定要调用commit()方法进行数据提交,否则所有操作不生效。


2

使用SharedPreferences读取数据

读取SharedPreferences中的数据只需要获取SharedPreferences对象,然后通过该对象的getXXX()方法根据相应的key值获取value值。该方法需要传递两个参数: 第一个参数为关键字,即保存的时候使用的key值;第二个参数为默认值,即如果根据key值没有找到value值时,返回该默认值。程序所读取的SharedPreferences文件不存在时,程序也会返回默认值,并不会抛出异常。SharedPreferences数据总是保存在data/data//shared_prefs目录下,并且SharedPreferences数据总是以XML格式保存,实例代码如下。

1  SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE); 
2  preferences.getString("name", "");
3  preferences.getInt("age", 0);

复制


上述代码中,第1行代码通过getSharedPreferences()获取SharedPreferences 对象,之后通过该对象的getString()方法和getInt()方法获取用户名和年龄。


3

使用SharedPreferences删除数据

使用SharedPreferences删除数据的时候,需要先获取SharedPreferences对象,并通过该对象的edit()方法获取Editor对象。通过调用Editor对象的remove(String key)方法删除数据。该方法中的参数为关键字,即键-值对的key值。该方法会删除key相对应的数据。如果要删除所有数据可采用clear()方法。实例代码如下。

1  SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE); 
2  SharedPreferences.Editor editor = preferences.edit();
3  editor.remove("name");
4  editor.clear();

复制


上述代码中,第1行代码通过getSharedPreferences()获取SharedPreferences 对象,之后通过该对象的edit()方法获取Editor对象,通过Editor对象中的remove()和clear()方法删除数据。


2

实战:

SharedPreferences保存用户名和密码


通过对SharedPreferences的学习,可以对“欢乐购商城”中的登录页面进行实现。界面布局与7.1节布局相同,在此不再重复演示。在程序中创建一个工具类SPSaveInfo保存用户名和密码。

程序清单7-7: chart0704\app\src\main\java\com\example\administrator\

1  public class SPSaveInfo {

2      public static boolean saveInfoToSP(Context context, String userName, String userPwd) {

3          SharedPreferences preferences = context.getSharedPreferences("data",
Context.MODE_PRIVATE);

4          SharedPreferences.Editor editor = preferences.edit();
5          editor.putString("userName", userName);
6          editor.putString("userPwd", userPwd);
7          editor.commit();
8          return true;
9      }
10      public static Map<String, String> getInfoFromSP(Context context) {

11          HashMap<String, String> hashMap = new HashMap<>();
12          SharedPreferences preferences = context.getSharedPreferences("data", Context.MODE_PRIVATE);
13          String userName = preferences.getString("userName", "");
14          String userPwd = preferences.getString("userPwd", "");
15          hashMap.put("userName", userName);
16          hashMap.put("userPwd", userPwd);
17          return hashMap;
18      }
19  }

复制


在上述代码中,第2~9行创建saveInfoToSP()方法,用于保存用户名和密码到data.xml文件中。在该方法中首先通过getSharedPreferences()方法获取到SharedPreferences对象,并通过该对象的edit()方法获取到Editor对象,并通过该对象将数据保存在文件中。

第10~18行创建一个getInfoFromSP()方法用来获取data.xml文件中保存的用户名和密码。在该方法中首先通过getSharedPreferences()方法获取到SharedPreferences对象,并通过该对象的getString()方法获取到用户名和密码,并将获取的数据存放在Map集合中。

MainActivity页面的代码如下。

程序清单7-8: chart0704\app\src\main\java\com\example\

1  public class MainActivity extends AppCompatActivity {

2      private TextView tvRegister;
3      private TextView tvFindPwd;
4      private EditText editName;
5      private EditText editPwd;
6      private Button btnLogin;
7      private String userName;
8      private String psw;
9      @Override
10      protected void onCreate(Bundle savedInstanceState) {

11          super.onCreate(savedInstanceState);
12          setContentView(R.layout.activity_main);
13          initView();
14          initListener();
15           Map<String, String> uerInfo = SPSaveInfo.getInfoFromSP(this);
16          if (uerInfo != null) {

17              editName.setText(uerInfo.get("userName"));
18              editPwd.setText(uerInfo.get("userPwd"));
19          }
20      }
21      private void initView() {

22          tvRegister = (TextView) findViewById(R.id.tv_register);
23          editName = (EditText) findViewById(R.id.et_user_name);
24          editPwd = (EditText) findViewById(R.id.et_psw);
25          tvRegister = (TextView) findViewById(R.id.tv_register);
26          tvFindPwd = (TextView) findViewById(R.id.tv_find_psw);
27          btnLogin = (Button) findViewById(R.id.btn_login);
28      }
29      private void initListener() {

30          btnLogin.setOnClickListener(new View.OnClickListener() {

31              @Override
32              public void onClick(View v) {

33         userName = editName.getText().toString().trim();
34                        psw = editPwd.getText().toString();
35                  if (userName.isEmpty() || psw.isEmpty()) {

36                      Toast.makeText(MainActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
37                      return;
38                  } else {

39                     Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
40                     boolean isSave = SPSaveInfo.saveInfoToSP(MainActivity.this, userName, psw);
41                      if (isSave) {

42                         Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
43                      }
44                  }
45              }
46          });

47      }
48  }

复制


运行以上程序,在用户名和密码框中分别输入“234”,单击“登录”按钮,弹出“登录成功”和“保存成功”表示用户名和密码已经保存在本地文件中,运行结果如图7-10所示。


■ 图7-10使用sp登录成功并保存登录信息


当关闭程序再次打开程序之后,界面上会自动加载出用户名和密码,如图7-11所示。


■ 图7-11再次登录自动加载登录信息


为了验证用户信息是否成功保存到了SharedPreferences中,可以在Device File Explorer视图中找到data\\data\\com.example.administrator.chart0704\\shared_prefs目录,然后找到 data.xml文件,data.xml文件目录如图7-12所示。


■ 图7-12文件保存的位置


打开data.xml文件。

1 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
2 <map>  
3 <string name="userPwd">234</string>  
4 <string name="userName">234</string>  
5 </map>

复制


使用saveInfoToSP类成功地把用户名和密码保存在文件中。从data.xml文件可知,该XML文件是以map为根节点,map元素的每个子元素代表一个key-value对,子元素的name属性值为value对应的类型名。



实例讲解

Android零基础入门到实战

精彩回顾

鸿蒙开发入门

开发第一个鸿蒙应用+页面跳转

Android中的数据存取

实战演练—文件存储实现自动登录



下期预告

Android中的数据存取

3. 实战演练——订单处理




3

参考书籍


《Android零基础入门到实战(App项目开发·鸿蒙开发入门·微课视频版)》

ISBN:9787302600671

作者:赵圣鲁、胡颖辉、余燕萍、汪宗伟、吴微微

定价:59.8元

扫码微店优惠购书


内容简介

本书围绕Android初学者从零基础到实战达人的过程进行设计,采用项目教学法,以作者开发的“欢乐购商城”App为例,以一个完整的项目开发为主线,将项目开发分解为9个教学模块,分别为App应用体验、Android基础界面控件、Android高级界面控件、列表控件、页面跳转与切换、Android中的数据存取、Android客户端与服务器端交互、综合项目“欢乐购商城”实现等。读者在学习基础知识过程中将熟悉App综合项目开发流程,逐步培养独立开发综合项目的能力,并最终实现综合项目。同时本书引入鸿蒙开发入门知识,供有兴趣的读者参考学习。本书可作为应用型本科计算机专业、软件专业、高职软件技术专业及相关专业的教材,也可作为Android和鸿蒙开发爱好者以及初、中级Android应用开发人员的参考工具书。


编辑推荐

为了方便读者学习,本书配套了微课教学视频、源码、课件、试题、课程大纲等教学资源。所有配套资源均可在清华大学出版社官方网站下载。其中安卓项目案例源码,基于Java JDK1.8+Android Studio Arctic Fox+Android SDK 11.0+gradle:7.0.0-beta04开发;鸿蒙项目案例源码,基于Open JDK1.8+DevEco Studio 2.1 release+sdk(api version 5)+gradle6.3开发。


扫码京东优惠购书


4

精彩推荐


文章转载自清华计算机学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论