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 ...
随机推荐
- Nginx学习笔记(二)--- 配置虚拟主机
Linux下安装Nginx https://www.cnblogs.com/dddyyy/p/9780705.html 1.虚拟主机介绍 一台服务器分成多个"独立"的主机,每台虚 ...
- SQL Server 基本UPDATE和DELETE语句
1.UPDATA 基本UPDATE语法:(可以修改多行的列) 2.DELETE
- Raspberrypi 3B+ 安装 php+sqlite
按照网上的命令都为安装php5-fpm 和 php5-sqlite, 但是发现无法找到软件,可能是系统版本比较高的缘故,原来的版本已经不支持了. 经过努力华找到如下安装方法 sudo apt-get ...
- Window7 上跑 Spark 单机模式
一.下载Spark 下载地址:http://www.eu.apache.org/dist/spark/spark-1.5.2/spark-1.5.2-bin-hadoop2.4.tgz 我这里测试这个 ...
- React 入门学习笔记整理(六)—— 组件通信
1.父子组件通信 1)父组件与子组件通信,使用Props 父组件将name传递给子组件 <GreateH name="kitty"/> 子组件通过props接收父组件的 ...
- [VUE ERROR] Duplicate keys detected: 'tab-user'. This may cause an update error.
错误消息如图: 如果你看到此错误消息,则说明 v-for 指令的 key值 重复了,只需修改你的 key值 让其不会重复即可.
- JavaScript按纯数字排序
直接上代码: var arr=[ {name:"张散步",age:"23",sports:"篮球",number:"23112 ...
- flask中的url_for的使用
有多个路由的程序需要连接不同的网页链接,例如导航条 模板中构建正确的动态url较为困难,如果重定义路由,模板中的链接失效 url_for()函数: 使用url映射中保存的信息生成url 用法: 用视图 ...
- maven(七),本地仓库
运行机制: 在pom.xml文件中添加依赖jar包时,首先会从本地仓库查找,如果本地仓库不存在,就从中央仓库下载到本地仓库,中央仓库是maven默认的远程仓库 仓库坐标 eclipse默认会在wind ...
- python第十五天-原来还差一份作业
作业 1: 员工信息表程序,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select ...