数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。

  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学习之基础知识九—数据存储(持久化技术)的更多相关文章

  1. Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储

    前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...

  2. Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

    上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...

  3. Android学习之基础知识十三 — 四大组件之服务详解第一讲

    一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...

  4. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  5. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

  6. Android学习之基础知识十一 —运用手机多媒体

    一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...

  7. Android学习之基础知识十—内容提供器(Content Provider)

    一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...

  8. Android学习之基础知识十四 — Android特色开发之基于位置的服务

    一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...

  9. Android学习之基础知识十六 — Android开发高级技巧的掌握

    一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...

随机推荐

  1. Spring全家桶系列–SpringBoot之AOP详解

    //本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...

  2. cordova极光推送插件使用

    首先是在极光官网注册登录账号,然后创建推送应用,创建完应用之后,点击打开应用,设置应用的包名,保存: 然后回到应用主界面,看到AppKey,以及MasterSecret,这时候MasterSecret ...

  3. Mysql数据库的(行记录)详细操作

    在Mysql管理软件中, 可以通过sql语句中的dml语言来实现数据的操作, 包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据 ...

  4. 正则与python的re模块

    一.正则表达式的语法 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用特殊的字符而不要启用它们特殊的含义.这与字符串字面值中相同目的的相同字符的用法冲突:例如,要匹配一个反斜线字面值, ...

  5. python中传值和传地址问题

    在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...

  6. python之黏包和黏包解决方案

    黏包现象主要发生在TCP连接, 基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看来,根本不知道该文件的字节流从何处开始,在何处结束. 两种黏包现象: 1 ...

  7. java中多线程详解-synchronized

    一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...

  8. Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏

    仅限于如下ArcGIS在线地图服务(高德提供数据): //概述:彩色中文含兴趣点版中国基础地图 //投影:WGS 1984 Web-Mercator //切片格式:MIXED90 //服务类型:基础地 ...

  9. CloudSim源代码学习——云数据中心(Datacenter)

    package org.cloudbus.cloudsim; import java.text.DecimalFormat;//十进制 import java.util.ArrayList; impo ...

  10. 反编译Apk得到Java源代码

    原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...