主要内容:
1.向文件存储数据
2.从文件读取数据
3.用SharedPregerences存储
4.从SharedPregerences读取数据
5.SQLite数据库相关内容
6.LitePal相关内容
0.Android中的持久化技术
数据持久化:将内存中的瞬时数据保存到存储设备中,存储在存储设备中的数据就拥有了持久状态。
三种数据持久化方式:文件存储、SharedPreference存储及数据库存储(这三种方式比起保存在SD卡中更简单、更安全)
1.文件存储数据
特点:
比较适合存储简单的文本数据或二进制数据,因为不对存储内容进行任何格式化处理,数据原封不动地保存到文件中
(复杂的文本数据需要定义一套自己的格式规范以便之后复杂文本的解析)
主要方法:Context类中的openFileOutput方法
方法中的两个参数: 文件名(不包含路径)、文件的操作模式(MODE_PRIVATE和MODE_APPEND)
MODE_PRIVATE:默认操作模式,覆盖原文件
MODE_APPEND:追加到原文件后
返回: FileOutputStream对象
存储路径: /data/data//files/
2. 从文件中读取数据
主要方法:Context类中的openFileInput方法
**方法中的 1 个参数: 文件名(不包含路径)
返回: FileInputStream对象
存储路径: /data/data//files/
得到FileInputStream对象之后就可以通过Java流的方式将数据读取出来
3.SharedPregerences存储数据
用键值对的方式存储数据
支持多种不同的存储类型
获取SharedPreferences对象的三种方法:
Context类中的 getPreference()方法
两个参数:文件名和操作模式(只有MODE_PRIVATE,也可以直接传入0,表示只有当前应用程序才可以对SharedPreference文件进行读写,其它均已被废弃)
Activity类中的getPreference()方法
只有1个参数:操作模式,文件名为当前活动的类名
PreferenceManager类中的getDefaultPreferences()方法
静态方法,接收一个Context参数,且自动使用当前应用程序包名作为前缀来命名SharedPreference文件
实现三步曲:
(1)获取SharedPreferences.Editor对象
SharedPreferences.Editor editor=SharedPreferences("filename","oprate mode").edit()
(2)向SharedPreferences.Editor对象中添加数据,用putBoolean()、putString()等方法
(3)调用apply()方法将添加的数据提交
存储路径: /data/data//shared_prefs/
4. 从SharedPreference中读取数据
用SharedPreferences对象中的getBoolean("key","defaultvalue")方法进行读取
相关代码请看→这里←
其它:
在Android Studio 3.4.1出现了无法访问文件目录的情况,这里使用adb shell来修改权限↓↓↓
adb shell的使用:
首先在系统变量种添加adb.exe的路径:
找到sdk路径下的platform-tools路径,将该路径添加到环境变量的path变量中
接着在cmd命令窗口就可以使用adb shell命令了:
上图中第二个箭头所指的位置需要做说明:
如果sdk在22时,出现的提示就和上图一样,虚拟机直接已经有了root权限,并且可以直接执行给data/data等目录添加权限的操作;如果sdk是26,要先通过su命令获取虚拟机的root权限,如果是目前的sdk28,则不能通过su命令获取root权限
5.SQLite数据库相关内容
【目录】
SQLite数据库简介
SQLite数据库的使用
(1). 创建数据库
(2). 升级数据库
(3). 添加数据
(4). 更新数据
(5). 删除数据
(6). 查询数据
(7). 用SQL语句直接操作数据
0616更新
1. SQLite数据库简介
SQLite是一款轻量级的关系型数据库,可以存储大量复杂的关系型数据;运算速度非常快,占用内存通常只需要几百KB;支持标准SQL语法和ACID事务。
ACID事务,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易双方的要求。
2. SQLite数据库的使用
1. 创建数据库
存放路径:/data/data//databases/
1). 抽象类SQLiteOpenHelper主要内容:
两个抽象方法:onCreate() 用来初次创建表时使用,onUpgrade升级数据库时使用
两个实例方法:getWritableDatabase()用来向数据库写数据,getReadableDatabase()用来从数据库读数据,返回一个SQLiteDatabase对象
2). 创建数据库的具体操作
得到实现了SQLiteOpenHelper的类MyDatabaseHelper的实例,并得到一个SQLiteDatabase对象,表示打开或成功创建了数据库BookStore.db:
MyDatabaseHelper中只需要写如下语句:
3). 用Android SDK中自带的调试工具:adb查看创建的数据库和表
路径:sdk的platform-tools目录
Windows中adb的使用方法和具体步骤:
1.添加环境变量到path
2.进入控制台(命令adb shell)
3.进入到数据库所在目录下(data/data/com.example.databasetest/databases)用ls命令查看该目录下具有的文件
4.用sqlite3 **.db命令打开对应的数据库,用.table命令查看其中有哪些表(其中android_metadata表是每个数据库中都会生成的),用.schema命令查看建表语句
过程中遇到的问题:
①遇到了Permission denied相关错误,参考这里的方法,把模拟器版本将到6.0及以下就可以了;
②退出...>的方法:输入"[空格];",空格和分号,该方法来自这里
2. 升级数据库
需要将版本号变为比原来版本号大的数
再在MyDatabaseHelper中写成如下形式:
3. 添加数据
出现过的小问题: adb中为什么select * from Book之后要先退出...>状态才能显示出表内数据?这是因为sql语句后要加;才完整
4. 更新数据
5. 删除数据
6. 查询数据
7. 用SQL语句直接操作表中数据
相关代码在这里
20190714更新
5.LitePal相关内容
1. 简介
LitePal是一个开源库,是一款开源Android数据库框架,采用了对象关系映射(ORM)的模式,并将一些数据库功能进行了封装,不用编写一行SQL语句就可以完成各种简表和增删改查的操作。
该项目的开源代码地址:
https://github.com/LitePalFramework/LitePal
2. 配置LitePal
在app/build.gradle中声明开源库的引用:
dependencies{
...
implementation 'org.litepal.android:java:3.0.0'
...
}
在main下新建assets目录,在该目录下新建litepal.xml文件,手动填写扩展名,内容为:
dbname是数据库名,version是数据库版本号,list指定所有映射类型
在AndroidManifest.xml文件中配置LitePalApplication
...
android:name=""org.litepal.LitePalApplication"
...
>
...
3. 创建和升级数据库BookStore.db
创建数据库:
首先定义一个Book表的实体类,继承LitePalSupport类
将Book类添加到对象关系映射模型列表中,在litepal.xml文件的list标签中配置如下代码:
调用Connector.getDatabase();方法自动创建数据库
数据库BookStore.db的路径:data/data/databases/,和SQLite创建数据的路径相同
升级数据库:
只需要在创建的基础上更改内容即可,如向Book类中添加字段或再创建一个表等。
4. 使用LitePal添加数据
实例化一个Book对象,用set方法添加各属性,最后用从LitePalSupport继承来的save方法完成添加操作。
5. 使用LitePal更新数据
两种方法,一种是重新用book对象调用set方法设置要更改的属性,再调用save方法;另一种是用set方法重新设置属性值后,调用updateAll()方法,在updateAll()方法中添加限定条件,如下:
6. 使用LitePal删除数据
两种方法,第一种是调用已存储对象的delete方法,在此之前先查询数据库中存在的条目;第二种是用LitePal调用deleteAll方法,如下:
7. 使用LitePal查询数据
查询部分功能相对复杂,主要分为对整张表的操作和限定各种条件的操作,各种限定操作的组合连缀功能可以免去之前query方法的一长串参数;LitePal还可以调用原生的SQL语句来执行更复杂的操作
相关代码看这里