Android中提供了五种主要的数据存储方式,分别为文件存储,SharedPreferences存储,SQLite数据库存储,ContentProvider存储,网络存储。主要整理文件存储,SharedPreferences存储,SQLite数据库存储,Litepal,序列化知识点及应用
- Android的文件存储主要分为内部存储和外部存储两部分
- 在Android中,文件存储的读写主要通过Java的IO流体系来实现。Android还提供了类中的和方法来简化文件的读写操作。
- 故可以分为四个板块解析文件存储,分别是:将数据写入内部存储文件中,读取内部存储文件中的数据。将数据写入外部存储文件中,读取外部存储文件中的数据
内部存储
- 存储路径:内部存储是是将应用中的数据以文件存储的方式存储在应用中,内部存储的路径通常是。
- 私有化:每个应用都有自己的私有内部存储空间,其他应用无法直接访问,如有需要访问需申请权限
- 自动清理:当应用被卸载时,内部存储中的文件也会被一并删除。
- 适用范围:适用于存储应用的私有数据,如配置文件、数据库、缓存等。这些数据通常不需要与其他应用共享,且当应用被卸载时,这些数据也需要被一并删除。
将数据写入内部存储文件中
- 使用了的方法来创建或打开文件,并返回一个对象。
-
通过提供的openFileOutput(String name, int mode))方法。
-
openFileOutput()方法用于打开应用对应的输出流,将数据存储在指定的文件中。
-
参数name表示文件名,mode表示文件操作的方式。
注意:第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和 MODE_APPEND。
- MODE_PRIVATE是默认的操作模式,表示该文件只能被当前程序读写
- 而MODE_APPEND,则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。
- 另外两种:MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE,这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作,不过由于这两种模式过于危险,很容易引起应用的安全性漏洞,已在 Android 4.2版本中被废弃。
2.使用方法将字符串转换为字节并写入文件。注意,这里使用了try-with-resources语句来自动关闭。
读取内部存储文件中的数据
- 这里使用了的方法来获取文件的。
- 方法用于打开应用对应的输入流,读取指定文件中的数据
- 然后通过和来逐行读取文件内容。
外部存储
- 存储路径:将数据以文件的形式存储到一些外部设备(例如SD卡或者设备内嵌的存储卡)上,属于永久性存储方式。(外部存储的文件通常位于storage/emulated/O目录下)
- 共享性:外部存储的文件可以被其他应用程序共享,当将外部存储设备连接到计算机时,这些文件可以被浏览、修改和删除,因此这种方式不安全。
- 适用范围:适用于存储需要与其他应用共享或长期保存的数据,如图片、视频、音乐等。这些数据在应用卸载时不会被删除,且可以被其他应用访问。
- 申请权限:文件中已经声明了相应的权限
将数据写入外部存储文件中(这里以机身存储为例,SD卡类似)
读取外部存储文件中的数据
- 是 Android 平台上一个轻量级的存储类,它允许你保存和读取应用程序的私有原始数据类型。
- 主要用于存储少量的数据,如用户的设置、偏好等。
- 以 XML 文件的形式保存在设备的内部存储中,文件名和路径由 Android 系统自动管理。
将数据存储在SharedPreferences
使用Context类中的getSharedPreferences()方法。
- 其中getSharedPreferences()方法接收两个参数,第一个参数是文件名,第二个参数是操作模式,现主要是MODE_PRIVATE。
具体实现步骤:
-
调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
-
向 SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putstring()方法,以此类推。
-
调用 apply()方法将添加的数据提交,从而完成数据存储操作。
读取SharedPreferences中数据
SharedPreferences 文件中读取数据会更加地简单。SharedPreferences对象中提供了一系列的get方法,用于对存储的数据进行读取,每种get方法都对应了SharedPreferences.Editor中的一种 put方法。
删除SharedPreferences中数据
- 删除某个特定的键值对,而不是清除整个文件中的所有数据可以使用的方法。
- 删除或清除某个文件中的所有数据,你不能直接删除文件本身(因为Android系统负责文件的管理),但你可以通过的方法来清除所有存储的数据。
关于 或 方法
- 方法是异步的,它不会返回任何值,但会尽快将更改写入磁盘。
- 方法是同步的,它会返回一个布尔值来表示更改是否成功写入磁盘。然而,由于 方法提供了更好的性能,并且对于大多数用例来说,立即知道更改是否成功写入磁盘并不是必需的,因此 是更推荐的方法。
项目中使用 SharedPreferences例子
finnal
-
定义:关键字用于声明一个变量、方法或类不能被修改(对于变量)或不能被重写(对于方法和类)。
-
作用:
-
对于变量:一旦给变量赋了初值,这个值就不能被改变。这通常用于定义常量。
-
对于方法:方法不能被子类重写。这通常用于防止方法被意外地修改其行为。
-
对于类:类不能被继承。这通常用于设计那些你不希望被扩展的类,可能是出于安全考虑或设计上的决定。
-
示例:在你的代码片段中,、、都是使用声明的字符串常量,这意味着这些字符串的值在编译时就已经确定,并且在整个程序中不能被改变。
static
-
定义:关键字用于声明属于类的变量和方法,而不是属于类的某个特定对象的实例变量和实例方法。
-
作用:
- 静态变量:属于类本身,在内存中只有一份拷贝,无论创建多少个对象,静态变量都只有一份拷贝被所有对象共享。
- 静态方法:属于类的方法,可以在没有创建对象的情况下通过类名直接调用。静态方法内部只能访问类的静态变量和静态方法,不能直接访问类的实例变量和实例方法。
final和static结合使用
- 当和一起使用时,它们通常用于定义类常量,这些常量在编译时就被确定,并且在整个类(甚至整个应用程序)中保持不变。
- 示例中的、、和都是类常量,它们在整个应用程序的生命周期内都是不变的。
创建一个存放SharedPreferences的工具类
主要包含了SharedPreferences的文件名,存储,读取,删除SharedPreferences数据等方法。具体代码:
如何调用
在其余Activity或Fragment中调用get()方法获取当前账号及是否是管理员账号。
可通过三目运算符判断是否是管理员admin,设置视图的可见性。例如:
- 三目运算符基本语法是。如果条件为真(true),则整个表达式的结果是的结果;如果条件为假(false),则结果是的结果。
- 方法用于设置视图的可见性。
- 作为参数时,视图可见。
- 作为参数时,视图不可见且不占用布局空间。
在Android开发中,SQLite是一种常用的轻量级数据库,用于存储和管理应用程序的本地数据。
SQLite数据库的创建
需要创建一个继承自的类,这个类将负责数据库的创建和版本管理。
- 重写onCreate(SQLiteDatabase db)方法创建数据库。
- 重写onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法数据库版本更新时调用
- 其中 super(context, DATABASE_NAME, null, DATABASE_VERSION); 参数分别是上下文,数据库文件名称,结果集,版本号。
SQLite数据库的增
使用实例获取对象,然后使用方法添加数据。
- getWritableDatabase()方法得到SOLiteDatabase 对象
- 获得ContentValues对象并将数据
添加到ContentValues对象中 - 调用insert()方法将数据插入information表中。
- insert()方法可以接收3个参数,第1个参数是数据表的名称;第2个参数表示,如果发现将要插人的行空行,会将这个列名的值设为null;第三个参数为ContentValues 对象。
- ContentValues类类似于 Map类,通过键值对的形式存入数据,这里的 key 表示插入数据的列名,value表示要插入的数据
- SQLiteDatabase 对象后一定要调用close()方法关闭数据库连接,否则数据库连接会一直存在,不断消耗内存
SQLite数据库的删
使用SOLiteDatabase类中方法根据条件删除数据
SQLite数据库的改
SQLiteDatabase 类中存在一个update()方法,用于修改数据库表中的数据。
- getWritableDatabase()方法得到SOLiteDatabase 对象db
- 获得ContentValues对象并将数据
添加到ContentValues对象中 - 通过调用put()方法将需要修改的字段名称和字段值放人对象values中
- 通过对象db调用update()方法来修改数据库表中对应的数据。
- update()方法传递了4个参数,其中,第1个参数表示数据库表的名称,第2个参数表示最新的数据,第3个参数表示要修改的数据的查找条件,第4个参数表示查找条件的参数
SQLite数据库的查
在进行数据查询时使用的是query()方法,该方法返回的是一个行数集合Cursor。通过getCount()方法获取到查询结果的总数,然后通过moveToNext()方法移动游标指向下一行数据,接着通过为geiString()方法传入列名获取对应的数据。
- Cursor是个游标接口,提供了遍历查询结果的方法。需要注意的是,在使用完Cursor后、一定要及时关闭,否则会造成内存泄露。
- query()方法包含7个参数,第1个参数表示表名称,第2个参数表示查询的列,第3个参数表示的是接收查询条件的子句,第4个参数接收查询子句对应的条件值,第5个参数表示分组6个参数用于接收having条件(定义组的过滤器),第7个参数表示排序方式。
创建一个继承自的类
将上方的几个方法汇总写入
如何调用
创建一个user实类
数据添加
数据删除
数据修改
数据查询
LitePal是一款开源的 Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行 SOL,语句就可以完成各种建表和增删改查的操作。
配置Litepal
- 编辑 app/build.gradle文件,在 dependencies 闭包中添加如下内容
- 接下来需要配置 litepal.xml 文件。右击app/src/main 日录→New→Directory,创建一个 assets 目录,然后在assets目录下再新建一个litepal.xml文件,
- 配置一下 LitePalApplication,修改 AndroidManifest.xml中的代码
-
MyApplication的作用:
Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便于管理程序内一些全局的状态信息。
经过这样的配置之后,LitePal就能在内部自动获取到Instance了并初始化了 LitePal 数据库
如何调用
创建实体类:
通过注解定义数据库表结构,创建对应的实体类。
添加修改数据
判断数据库中是否存在了该商品,存在不保存,不存在则添加商品,或重新设定。
删除数据
查找数据
序列化是一个重要的概念,它涉及到将对象的状态信息转换为可以存储或传输的形式(如保存到文件、通过网络发送等),以及之后能够将这些信息恢复回原来的对象。
什么是序列化和反序列化
-
序列化:将java堆内存中的对象转为二进制字节码;
-
反序列化:将二进制字节码转为java对象
为什么要序列化(序列化转成二进制码的目的)?
一句话解释:可传输、可存储、持久化。
将内存中的对象的状态信息转换为可以存储或者传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或者持久性存储区。以后,可以从存储区中读取或者反序列化对象的状态,重新创建该对象。简单地说,序列化就是讲运行时的对象状态转换成为二进制,然后保存到流、内存或者通过网络传输给其他端.
序列化(Serialization)
序列化是指将数据结构或对象状态转换为可以存储或传输的格式的过程。这种格式通常是平台无关的,可以是二进制流、文本文件(如XML、JSON)等。序列化的目的是将对象的状态保存下来,以便可以在程序的后续运行中重新加载,或者通过网络传输到另一个系统或应用程序中。
序列化通常涉及以下几个步骤:
- 遍历对象:访问对象的所有成员变量。
- 转换成员变量:将成员变量的值转换为可以存储或传输的格式。
- 写入:将转换后的数据写入到存储介质(如文件、数据库)或通过网络发送到其他系统。
反序列化(Deserialization)
反序列化是序列化的逆过程,即将存储或传输的格式转换回原始的数据结构或对象的过程。反序列化的目的是重新构造对象,使其具有序列化时的状态。
反序列化通常涉及以下几个步骤:
- 读取:从存储介质(如文件、数据库)或网络接收序列化后的数据。
- 解析:解析接收到的数据,提取出对象的成员变量值。
- 重构对象:使用提取出的成员变量值,重新构造出原始的对象。