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

  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数据库存储。由于这一部分涉及的内容很多,我们单独拿一讲来讲述。