视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷

任何一个程序其实说白了就是在不停地和数据打交道,数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证及时手机关机的情况下,这些数据仍然不会丢失。

Android中存储方式有五种:

  1. 使用SharedPreferences存储数据
  2. 文件存储数据
  3. SQLite数据库存储数据
  4. 使用ContentProvider存储数据
  5. 网络存储数据

SharedPreferences存储数据

适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等

核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。

创建SharedPreferences的方法:

Context getSharedPreferences()
Activity getPreferences()
PreferenceManager getDefaultSharedPreference()

SharedPreferences使用方法:

edit() 开始编辑
apply()和commit() 提交数据
getXXX() 获取数据
public class MainActivity extends AppCompatActivity {
private EditText editText;
// sp保存数据
SharedPreferences config;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建SP
config = getSharedPreferences("config", MODE_PRIVATE);
editText = (EditText) findViewById(R.id.editText);
// 读取保存的数据 写入到editText
// 取数据 参数2为 如果找不到"data"key值,默认返回的数据
String data=config.getString("data","");
editText.setText(data);
}
/**按钮点击事件*/
public void saveData(View v) {
// 1 获取输入的内容
String data = editText.getText().toString();
// 2获取到了编辑器
SharedPreferences.Editor edit = config.edit();
// 3 保存数据 key -value
edit.putString("data",data);
//4 保存到文件中
//edit.commit(); // 效率慢
edit.apply(); // 效率快
}
}

看到上面的代码,我们就可以做保存密码的实际案例了:

视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷

MD5加密

上面的Demo,我们保存了密码,一般在实际开发的过程中,保存密码都不要保存明文, 很容易被别人窃取密码, 一般都对密码进行加密

常见的加密方式为MD5加密

视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷

public class MD5Utils {
/**
* 对密码进行加密
* @param password 要加密的密码
* @return 密文
*/
public static String digest(String password){
try {
//加密方式为MD5加密
MessageDigest digest=MessageDigest.getInstance("MD5");
// 把一个byte数组 转换成加密后byte数组
byte[] bytes = digest.digest(password.getBytes());
StringBuilder sb=new StringBuilder();
for(byte b:bytes){
// 去掉负数
int c=b&0xff; // 负数转换成正数 // 加盐
String result=Integer.toHexString(c)+3;// 把10进制的数 转换成16进制的数 0 255
if(result.length()<2){
sb.append("0");// 让十六进制数 全部都是两位数
}
sb.append(result);
}
return sb.toString(); // 把加密后的密文返回回去 } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
// can't reach
return "";
}
}

MD5加密是不可逆的加密算法, 只能 明文->密文 密文是不能转换成明文的, 银行卡密码都是采用MD5加密的,但是银行卡密码都是用md5加密后的密文再进行加密,反复几十次,基本上保证密码非常安全。

未完待续…..

Android教程 -09 数据的持久化存储的更多相关文章

  1. ios开发之数据的持久化存储机制

    IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...

  2. Can JavaScript connect with MySQL? 浏览器控制台的js采集数据结果持久化存储

    浏览器控制台的js采集数据结果持久化存储 how to open a file in javascript https://developer.mozilla.org/en-US/docs/Web/A ...

  3. Longhorn入门级教程!轻松实现持久化存储!

    介 绍 在本文中你将学会如何使用k3s在Civo上运行Longhorn.如果你还没使用过Civo,可以到官网注册(https://www.civo.com/ )还可以申请免费的使用额度.首先,需要一个 ...

  4. (三十九)数据的持久化存储-plist实现(XML属性表)

    iOS应用数据存储的常用方式: 归档:用某种格式保存数据. XML属性列表(plist)归档(持久化) Preference 偏好设置 NSKeyedArchiver归档 SQLite3 数据库 效率 ...

  5. unity中数据的持久化存储

    unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...

  6. vuex数据持久化存储

    想想好还是说下vuex数据的持久化存储吧.依稀还记得在做第一个vue项目时,由于刚刚使用vue,对vue的一些基本概念只是有一个简单的了解.当涉及到非父子组件之间通信时,选择了vuex.只是后来竟然发 ...

  7. In-Memory:内存优化数据的持久化和还原

    数据持久化是还原的前提,没有数据的持久化,就无法还原内存优化表的数据,SQL Server In-Memory OLTP的内存数据能够持久化存储,这意味着内存数据能够在SQL Server实例重启之后 ...

  8. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  9. scrapy框架持久化存储

    基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...

随机推荐

  1. Spring Boot邮件功能

    1.应用场景 邮件功能的应用场景可谓十分广泛,诸如注册用户.密码找回,消息通知.以及一些程序异常通知等都需要使用到该功能. 正是由于邮件功能的使用广泛,因此springboot也加在它的组件中添加了邮 ...

  2. MyBatis中动态加载where条件

    1.trim 2.where 1 = 1 where 1=1 <if test="beginDate !=null and beginDate !='' "> and ...

  3. 使用dos行命令实现文件夹内文件名统计

    1.进入在dos环境下 2.进入需要统计的目录下. 3.使用命令 dir /b>e:1.xls 结果:会在路径(e:\资料\资料整理)下生成一个新的文件(1.xls).1.xls把路径(e:\资 ...

  4. hive拉链表取数

    例如,一个借款用户在hive上的拉链表.(end_dt存放逻辑与普通介绍的拉链表不一致) 需要拉去它在2019-05-01日的状态, 取数逻辑是: select * from tb where sta ...

  5. FreeMarker中<#include>和<#import>标签的区别

    在使用freemarker作为前端页面模板的应用中,会有很多的freemarker模板页面,这些ftl会在不同的页面中重复使用,一是为了简化布局的管理,二是可以重复使用一些代码. 在freemarke ...

  6. linux系统 (实验二)实验楼的课程笔记

    who am i  打印用户名和终端 终端的启动时间 whoami    打印用户名 who 命令其它常用参数 参数 说明 -a 打印能打印的全部 -d 打印死掉的进程 -m 同am i,mom li ...

  7. HTTP请求响应头信息

    HTTP请求响应头信息 请求:(request) 组成部分: 请求行 请求头 请求体 请求行:请求信息的第一行 格式:请求方式 访问的资源 协议/版本 例如:GET /day0801/1.html H ...

  8. 多云混合云之多集群统一管理:基于阿里云ACK统一纳管多个不同Kubernetes集群

    目前阿里云云原生产品家族已经支持多集群管理功能,允许使用阿里云容器服务Kubernetes(简称ACK)控制台或kubectl命令接入.统一纳管其他公有云.客户IDC自建K8s集群,集中管理部署K8s ...

  9. qt绘制渐变区域

    // 原理:通过点到线,然后叠加成区域.同理,可使用其他图形 QPainter painter(m_pWidget); QLinearGradient linearGradient(QPointF(, ...

  10. PAT天梯赛L3-011 直捣黄龙

    题目链接:点击打开链接 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求 ...