Android开发学习笔记——Android的持久化数据存储

本文详细介绍了Android中的三种数据持久化存储方式:文件存储,包括openFileOutput和openFileInput的使用;SharedPreference存储,讲解了其基本使用、保存和获取数据的流程;SQLite数据库存储,涵盖了创建数据库、使用SQL语句操作、增删改查及SQLiteOpenHelper的使用。通过实例展示了如何在Android应用中实现数据的持久化存储。
摘要由CSDN通过智能技术生成


在我们的开发过程中,我们可以发现,应用程序的使用实际上就是对数据的交互,我们的应用所实现的实际上就是对不同数据的展示和操作。在实际开发中,我们往往会通过网络请求来获取数据,但是有时候我们也需要将数据保存起来以备下一次的使用,当然我们也可以重新从服务器拉取数据,但是网络请求操作是属于耗时操作,而且需要消耗网络资源,因此在开发中我们应该尽量减少网络请求的次数。所以,我们就需要去在本地存储一些应用相关信息,比如:常见的记住密码、保留登录状态等。
我们知道,在代码中,无论全局变量又或是局部变量,这些数据都是保存在内存中的,一旦因为程序关闭又或是其它原因造成内存被回收,那么内存中的数据均会被销毁而丢失,因此这些数据也都被称为瞬时数据。如果使用瞬时数据来保存密码或是登录状态,这显然不合理的,因为当应用关闭后数据就丢失了,在下次开启应用时无法再次获取到数据。此时,我们就需要使用到Android的持久化数据技术了。Android为我们提供了文件存储、SharedPreference存储和SQLite数据库存储等本地持久化存储方式。

文件存储

提到持久化存储,我们其实可以很容易想到,既然内存中的数据会丢失,那么我们将数据保存为一个文件不久可以了吗?确实,这种方式是可行的,文件存储时Android中最基本的一种数据存储方式,它可以将数据保存到文件中,比较适合用于存储一些简单的文本数据或是二进制数据。在我们使用应用过程中,通常会产生很多缓存文件,那就是应用将需要经常访问的数据通过文件存储的形式将数据保存起来以减少网络请求,即缓存。
文件存储实际上简单来说就是在手机上创建一个文件,然后来存储数据,因此其本质上来说就是对文件的I/O操作,使用输入输出流来完成。

openFileOutput和openFileInput

Android中,context提供了openFileOutput和openFileInput两个方法来操作本应用程序中数据文件夹中即/data/data/< package name >/files/目录下的文件IO流。
openFileOutput方法可以接收两个参数,其中第一个参数为文件名,我们不可以包含路径,因为使用openFileOutput方法开启的文件均为内部存储/data/data/< package name >/files/目录下的文件;第二个参数为文件操作模式,我们常用的主要为MODE_PRIVATE和MODE_APPEND,前者为默认模式,如果文件已存在就会覆盖原文件内容,后者会追加到原内容之后。而openFileInput方法只接收一个文件名一个参数。在获取到输入输出流之后,其它操作就属于IO操作了。
具体使用方式如下:

//保存数据
val output = openFileOutput("test.txt", Context.MODE_PRIVATE)
val writer = BufferedWriter(OutputStreamWriter(output))
writer.write("this is a test string")
writer.close()

//读取数据
val input = openFileInput("test.txt")
val reader = BufferedReader(InputStreamReader(input))
val str = StringBuilder()
reader.forEachLine {
   
    str.append(it)
}
reader.close()
Log.e("test_file", str.toString())

查看Device File Explored,如下图:
在这里插入图片描述
日志输出如下:
在这里插入图片描述
需要注意的时,文件的IO操作属于耗时操作,我们在实际开发中要将其放在子线程中执行,以防阻塞进程。同时,我们也要注意在使用完IO流之后要调用close方法进行关闭。
通过openFileOutput和openFileInput获取到的文件都是位于内部存储的指定路径下的文件,在该路径下的文件只有本应用能够访问且当应用被卸载时,文件也会同步被删除。实际上,使用文件存储进行持久化数据存储,我们完全可以设置文件路径为任意路径下,我们可以将文件保存至外部存储中,不过此时,我们可能会需要申请SD卡的读写权限。

SharedPreference存储

文件存储能够简单地将数据存储在文件中,但是我们往往难以将其格式化存储,比如说我们需要存储用户名和用户密码两个信息,尽管我们可以通过文件存储将其保存到本地文件中,但是在之后数据使用时确显得不太方便,因为文件存储只是将两个数据简单的存储起来,我们无法对其进行区分,必须提前设置一定的格式,然后再进行解析。
与文件存储不同的是,SharedPreference是使用键值对的方式来存储数据的,也就是说对于每一条数据value都有一条对应的键key,而且支持不同的数据类型,我们可以轻易通过key来获取对应的value值且数据类型不变,因此与文件存储相比SharedPreference会方便很多。

基本使用

SharedPreference的使用非常简单,基本可以分为以下几步:

  • 首先,获取SharedPreference对象;
  • 通过SharedPreference对象的edit()方法获取对应的Editor对象,然后调用对应的putXXX方法并调用commit或是apply来存储数据;
  • 调用SharedPreference对象的getXXX方法根据键值key获取对应的数据。

在Android中主要提供了三种方法用于得到SharedPreference对象,具体如下:

方法名 说明
getSharedPreferences 通过Context调用;存在两个参数,第一个参数为文件名,第二个参数为操作模式目前只能指定为MODE_PRIVATE(自 API 级别 17 起,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 模式已被弃用。 从 Android 7.0(API 级别 24)开始,如果您使用这些模式,Android 会抛出 SecurityException。如果您的应用需要与其他应用共享私有文件,可以通过 FLAG_GRANT_READ_URI_PERMISSION 使用 FileProvider。)
getPreferences 通过Activity调用;只存在一个操作模式参数,其文件名为当前Activity的类名
getDefaultSharedPreferences 通过PreferenceManager类(已被废弃)调用的静态方法,只接收一个context参数,使用当前应用包名作为文件名

具体使用如下:

 //第一个参数为文件名,第二个参数为操作模式
 val sp = getSharedPreferences("test_sp", Context.MODE_PRIVATE)
 //只有一个操作模式参数,使用当前Activity类名作为文件名
 val sp2 = getPreferences(Context.MODE_PRIVATE)
 //接收一个context参数,使用当前应用包名作为文件名(已废弃)
 val sp3 = PreferenceManager.getDefaultSharedPreferences(this)

事实上,SharedPreference也是通过XML文件的形式存储的,所有的SharedPreference文件都存储在/data/data/< package name>/shared_prefs/目录下,如果指定的SharedPreference文件不存在就会新建一个。使用Device File Explorer查看如下图:
在这里插入图片描述
SharedPreference中数据以XML的格式存储,如下:
在这里插入图片描述

保存数据

使用SharedPreference保存数据,首先我们需要通过edit()方法获取对应的SharedPreference.Editor对象,然后调用对应数据类型的put方法指定数据的key-value键值对,最后调用commit()或者是apply()即可。SharedPreference支持的数据类型包括Int、String、Boolean、Float、Long和StringSet,其对应的put方法为:PutInt、PutString、PutBoolean、PutFloat、PutLong和PutStringSet,具体使用如下:

val sp = getSharedPreferences("test_sp", Context.MODE_PRIVATE)
val editor = sp.edit()
editor.putString("user_name", "yang")
editor.putString(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值