Android学习之基础知识九—数据存储(持久化技术)
数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。
Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储、SharedPreference存储、数据库存储。除了这三种方式外,还可以将数据保存在手机的SD卡中,不过相对比较麻烦,而且安全性方面也相对较低。下面我们就来了解一下这三种数据持久化的方式:
一、文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有的数据都原原封不动的保存在文件当中,因此它比较适合用于存储一些简单的文本数据或二进制数据。如果你想要使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样可以方便之后将数据从文件中重新解析出来。
1.1、将数据存储在文件中
第一步:创建项目:FilePersistenceTest,在activity_main.xml中设置一个输入框

第二步:将在输入框中输入的数据保存在文件中


第三步:运行程序,输入一段文字后,点击Back键退出程序

第四步:查看文件
我们在保存数据的时候,只设置了文件名,而没有设置保存路径,这是因为所有的文件默认都是保存在:/data/data/包名/files/目录下,要找到这个路径,需要打开:Android Device Monitor,步骤如下:
找到SDK目录 ---> tools目录下 ---> 点击monitor.bat打开 --->找到:File Explore栏 ---> 该栏下到:/data/data/com.workspace.hh.filepersistencetest/files/data.(注意:这里的包名是你自己的包名)---> 找到后点击右上角的导出按钮,将data文件导出并打开。



1.2、从文件中取出数据
第一步:取出数据,下面代码中有两个地方需要注意:
1、调用EditText的:setSelection()方法是为了将输入的光标移动到文本的末尾位置,以便于继续输入。
2、对字符串进行非空判断的时候,使用了:TextUtils.isEmpty()方法,这是一个非常好的方法,它可以进行两种空值的判断,当传入的字符串等于null或者等于空字符串的时候,这个方法都是返回的true.所以我们不需要先单独判断这两种空值再使用逻辑运算符连接起来了。

第二步:运行程序(左),我们重新输入文字(中),然后点击Back键退出程序后,再打开程序(右)

1.3、总结
文件存储用到的核心就是Context类提供的:openFileInput()和openFileOutput()两种方法。但是它不适合用于存储一些较为复杂的文本数据。
二、SharedPreferences存储
SharedPreferences存储是另一种数据持久化的方式,它比文件存储更加简单易用,而且可以很方便对某一指定的数据进行读写存储。不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持很多不同的数据类型存储,如果存储的数据类型是整型,那么读出来的数据也是整型的;如果存储的数据是一个字符串,那么读取出来的数据仍然是字符串。
2.1、将数据存储到SharedPreferences中
要想使用SharedPreferences来存储数据,首先要获取到SharedPreferences对象。Android中主要提供了三种方法用于得到SharedPreferences对象:
第一种:Context类中的:getSharedPreferences()方法
这个方法接收两个参数,第一个参数指定SharedPreferences文件的名称,如果文件不存在就会自动创建一个,SharedPreferences文件都是存放在:/data/data/项目包名/shared_prefs/目录下。第二个参数用于指定操作模式,目前只有:MODE_PRIVATE这一种模式可选。它是默认的操作模式,和直接传入0的效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写,其他几种操作模式均已被废弃。
第二种:Activity类中的:getPreferences()方法
这个方法和Context中的:getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
第三种:PreferenceManager类中的:getDefaultSharedPreferences()方法
这个方法是一个静态的方法,它接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。
上面是三种得到SharedPreferences对象的方法,得到SharedPreferences对象之后,就可以开始向SharedPreferences文件存储数据了,主要分为三步实现:
(1)调用SharedPreferences对象的:edit()方法来获取一个SharedPreferences.Editor对象
(2)向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用:putBoolean()方法,添加一个字符串则使用:putString()方法,以此类推。
(3)调用:apply()方法将添加的数据提交,从而完成数据存储操作。
下面我们就来体验一下SharedPreferences存储的用法:
第一步:新建SharedPreferencesTest项目,在activity_main.xml中设置一个按钮

第二步:在活动中给按钮添加监听事件,实现通过点击按钮来保存指定数据的功能,这里是通过第一种方法来获取的SharedPreferences对象。

第三步:运行程序,打开Android Device Monitor,找到:/data/data/项目包名/shared_prefs/目录下的data文件

第四步:导出文件并打开,我们可以看到数据是使用XML格式来保存的。

2.2、从SharedPreferences中读取数据
SharedPreferences对象中提供 一系列get方法,用于对存储的数据进行读取,每种get方法都对应了SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用:getString()方法,这些get方法都接收两个参数,第一个参数是键,传入存储数据时使用的键就可以得到相应的值了;第二个参数是默认值,即表示当传入的键找不到对应的值时会以什么样的默认值进行返回。
相对于保存数据,取出数据就更加简单了:
第一步:设置一个取出数据的按钮:Restore Data

第二步:设置按钮的监听事件,通过点击按钮将取出的数据打印出来

第三步:运行程序,点击按钮,查看打印出来的日志,这样我们就把数据取出来了。

2.3、实现记住密码的功能
第一步:借助BroadcastBestPractice项目,在该项目中直接编辑。首先在登录界面设置一个复选框和提示记住密码的文本:
CheckBox控件是一个复选框控件,用户可以通过点击的方式来进行选中和取消。

第二步:实现逻辑

代码分析:
首先在onCreate()方法中获取到SharedPreferences对象,然后调用它的getBoolean()方法去获取remember_password这个键对应的值。一开始当然不存在对应的值了,所以会使用默认值false,这样就什么都不会发生。接着在登录成功之后,如果用户想要记住密码,勾选了复选框,这时将remember_password设置为true,然后把account和password对应的值都保存到SharedPreferences文件当中并提交,如果复选框没有被选中,就简单的调用一下clear()方法,将SharedPreferences文件中的数据全部清除掉。
当用户选中了记住密码的复选框,并成功登录一次后,remember_password键对应的值就是true了,这个时候如果再重新启动登录界面,就会从SharedPreferences文件中将保存的账号和密码都读取出来,并填充到文本输入框中,然后把记住密码复选框选中,这样就完成记住密码的功能了。
第三步:运行程序,可以看到界面上多了一个记住密码复选框,点击登录,就会跳转到MainActivity,接着在MainActivity中发出一条强制下线的广播,会让程序重新回到登录界面,此时你会发现,账号和密码都已经填充到界面上了,如下图所示:登录前(左)、登录后(右)

注意:
从上面屏幕上我们看到:Account和Password距离屏幕边框太近,我们在这里可以设置一个:android:layout_margin属性,调整它距离边框的位置:

然后重新运行程序效果如下:

2.4、总结
上面实现的记住密码的功能只是个简单的实例,并不能在实际的项目中直接使用。因为将密码以文明的形式存储在SharedPreferences文件中是非常不安全的,很容易就会被别人盗取,因此在正式的项目里还需要结合一定的算法来对密码进行保护才行。
接着我们开始将第三种数据持久化技术:SQLite数据库存储。由于这一部分涉及的内容很多,我们单独拿一讲来讲述。
Android学习之基础知识九—数据存储(持久化技术)的更多相关文章
- Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储
前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...
- Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库
上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Android学习之基础知识四-Activity活动4讲(Intent传递数据)
Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据. 一.使 ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
- Android学习之基础知识十一 —运用手机多媒体
一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
随机推荐
- 浅析"WeixinJSBridge is not defined"
Fundebug并没有使用微信 JS-SDK,然而却收到了WeixinJSBridge is not defined的报错: 我们的用户也收到了类似的错误报警,并且很多开发者都遇到类似的问题: 我的微 ...
- mysql 5.7 线程阻塞处理
出现的错误: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 解决办法: 查看sleep的进程 m ...
- HTML命名规范
一.关于选择器的命名 W3C CSS2.1的 4.1.3 节中提到:标识符(包括选择器中的元素名,类和ID)只能包含字符[a- zA-Z0-9]和ISO 10646字符编码U+00A1及以上,再加 ...
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- npm 走 privoxy 代理经常出现 shasum check failed 的解决办法
今天在下载一个比较大的项目,经常 shasum check failed ,太烦了,于是想切淘宝源,分别尝试 nrm 切换和传递 --registry ,结果都出现 Unexpected end of ...
- 【代码笔记】Web-HTML-图像
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- SSM 开发 Tars
目录结构 tars生成的文件当成 controller 来调用 service ,service 调用 mapper POM 注意如果 mybatis是3.4.1 spring 是4.1.14的话, ...
- mysql5.7 安装和多源复制实践
MySQL 5.7发布后,在复制方面有了很大的改进和提升.比如开始支持多源复制(multi-source)以及真正的支持多线程复制了.多源复制可以使用基于二进制日子的复制或者基于事务的复制.下面我们说 ...
- 【PAT】B1058 选择题(20 分)
这道题的逻辑怪复杂的,写起来蛮费时间的 结构体中要储存的信息多,整体不难,信息量大,容易把人搞蒙 #include<stdio.h> #include<string.h> #i ...
- PHP实现一个简陋的注册登录页面
PHP实现一个简陋的注册登录页面 今天来水一篇没有**用的 /滑稽脸,代码简陋臃肿考虑不全,各位大佬轻喷,还望不吝赐教. 首先考虑了一下需要至少四个页面:register.html.register. ...