十一.Android数据持久化方法之一——sharedPreferences
来源:互联网 发布:java nanotime效率 编辑:程序博客网 时间:2024/05/22 13:33
1.sharedpreferences的存储和读取
- 概论
Android数据存储使用sharedpreferences(以下简称SP),以键值对的方式存储在xml文件里。文件结构如下:
<map> <string name="username">18883340065</string> <string name="password">6b28020697bf708712a824caca5fea5f</string></map>
此文件名为自定义,文件存储目录为/data/data/包名/shared_prefs。
- 存储
使用SharedPreferences.Editor 进行存储。代码如下:
SharedPreferences.Editor editor=getSharedPreferences("文件名",模式 ).edit();editor.putString(键,值);editor.commist();
- 读取
使用SharedPreferences直接读取。
SharedPreferences pref=getSharedPreferences("文件名",模式);Sring name=pref.getString(键,默认值);
2.使用SharedPreferences实现用户自动登录
2.1 思路
- 用户注册成功时就将用户名和密码使用SP保存在user.xml中。
- 每次启动APP,先启动WelcomeActivity界面,然后进行判断。
- 如果user.xml中用户名和密码都存在时,就自动登录。如果用户名密码不存在时,就跳转到登录页面。
- 考虑到安全性,存储方式不能直接存明文密码,需要进行加密。于是使用了MD5加密。
2.2 流程
- 具体流程如图:
2.3 代码
- 打开APP的第一个Activity,即WelcomeActivity,做出是否自动登录的判定。无xml视图文件。
public class WelcomeActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //获取用户名密码 SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE); String username = pref.getString("username", ""); String password = pref.getString("password", ""); //进行判定 Intent intent=new Intent(); if(!username.equals("")&&!password.equals("")){ intent.setClass(this,MainActivity.class); }else{ intent.setClass(this,LoginActivity.class); } this.finish(); startActivity(intent); }}
- 登录页面的关键性代码,登陆时读取SP内数据,再将输入的密码进行MD5加密,然后与SP内密码比较,若一样则正常登陆。
public void onClick(View v) { Intent intent1 = new Intent(); switch (v.getId()) { case R.id.login: //取数据 SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE); String username = pref.getString("username", ""); String password = pref.getString("password", ""); //对输入的密码进行MD5加密 String passwordGet=MD5Utils.encode(password_tx.getText().toString()); //判定 if (username.equals(username_tx.getText().toString()) && password.equals(passwordGet)) { intent1.setClass(LoginActivity.this, MainActivity.class); startActivity(intent1); }else{ Toast.makeText(this, password, Toast.LENGTH_SHORT).show(); } break; case R.id.register: intent1.setClass(LoginActivity.this, RegisterActivity.class); startActivity(intent1); break; } }
- 注册页面关键代码,使用java自带的正则表达式进行了对用户名和密码的检测,并且在注册成功后将数据用SP存储。
public void check() { //正则表达 Pattern pattern_user = Pattern.compile("\\d{11}"); Matcher matcher_user = pattern_user.matcher(username.getText().toString()); boolean user = matcher_user.matches(); Pattern pattern_pass = Pattern.compile("\\w{8}"); Matcher matcher_pass = pattern_pass.matcher(password.getText().toString()); boolean pass = matcher_pass.matches(); //存储数据 if (user && pass) { SharedPreferences.Editor editor = getSharedPreferences("user", MODE_PRIVATE).edit(); editor.putString("username", username.getText().toString()); password_tx=password.getText().toString(); password_tx=MD5Utils.encode(password_tx); editor.putString("password", password_tx); editor.commit(); Toast.makeText(this, password_tx, Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.setClass(RegisterActivity.this, MainActivity.class); startActivity(intent); } else if (!user) { Toast.makeText(this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show(); } else if (!pass) { Toast.makeText(this, "请输入正确的密码", Toast.LENGTH_SHORT).show(); } }
- MainActivity代码,拥有一个TextView显示当前用户名,拥有一个Button退出登录跳转到登录页。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtUser=(TextView)findViewById(R.id.txt_user); SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE); String username = pref.getString("username",""); txtUser.setText(username); btnExit=(Button)findViewById(R.id.btn_exit); btnExit.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(MainActivity.this,LoginActivity.class); startActivity(intent); } }); }
- MD5加密类代码,我也看不大懂T_T
package com.luffy.sharedpreferencesdemo;import java.security.MessageDigest;public class MD5Utils { /** * md5加密的工具类 * * @param password * @return */ public static String encode(String password) { try { MessageDigest digest = MessageDigest.getInstance("md5"); byte[] results = digest.digest(password.getBytes()); StringBuilder sb = new StringBuilder(); for(byte b : results){ int number = b&0xff; String hex = Integer.toHexString(number); if(hex.length()==1){ sb.append("0"); } sb.append(hex); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } }}
3.日常福利
- GIthub
0 0
- 十一.Android数据持久化方法之一——sharedPreferences
- Android数据持久化——SharedPreferences
- 十三.Android数据持久化方法之一——SQLite
- Android——数据持久化之SharedPreferences
- android数据持久化 SharedPreferences
- 十二.Android数据持久化方法之一——文件保存
- Android数据持久化之SharedPreferences
- android数据持久化之SharedPreferences
- Android持久化数据之初识SharedPreferences
- android-数据持久化之SharedPreferences
- Android数据持久化存储-SharedPreferences
- #android#数据持久化--SharedPreferences存储
- Android的数据存储方式之一——SharedPreferences
- Android存储数据方法——SharedPreferences
- 数据持久化之SharedPreferences
- android的content provider之一:SharedPreferences && 进程数据共享方法
- Redis研究(十一)—数据持久化
- Android数据持久化之二:SharedPreferences 存储(上)
- QWidget中嵌入win32 window
- 版本更新
- js常用操作
- java多线程回调方法的理解
- 笔记本无法连接显示器 Windows 10 - Your PC can't project to another screen
- 十一.Android数据持久化方法之一——sharedPreferences
- iOS蓝牙控制模型
- 华丽的模态窗口弹出效果示例
- 物理学家揭示深度学习原理:神经网络与宇宙本质惊人关联
- 欢迎使用CSDN-markdown编辑器
- 几个简单的数据点平滑处理算法
- windows 共享开发linux项目
- iOS图片轮播
- OracleLinux-R5-U11-x86_64安装