安卓开发之数据存储学习

安卓原生的数据存储方式主要有三个:
1是文件存储;2是SharedPreferences存储,在安卓软件分析中经常会看到里面明文存储着用户名与密码;3是SQLite数据库存储
分别存储的位置在/data/data/包名/File、/data/data/包名/SharedPeference、/data/data/包名/SQLite。

文件存储

写入文件:
在这里插入图片描述
通过openFileOutPut方法得到FilePutputStream实例,其有两个参数,参数1代表存入文件的名称,参数2代表文件的操作模式,这里选择默认操作模式,之后通过FilePutputStream的实例的write方法写入文件。
文件读取:
通过openFileInput方法得到FileInputStream实例,参数是要读取的文件名,之后调用实例的read方法读出数据:
在这里插入图片描述
效果如下:
点击写入:
在这里插入图片描述
之后清除EditText内容,之后点击读取:
在这里插入图片描述

SharedPreferences

软件安全测试中常常会看到这种情形,应用把用户名又是甚至密码都明文存储在SharedPreferences文件中,因此这例学习一下SharedPreferences的用法
在这里插入图片描述
在前面也看到,文件存储的方法会把数据原封不动的写入文件中,因此只适合存储一些简单的数据,如果想要存储一些复杂性的数据就显得无能为力。SharedPreferences是一种轻型的数据存储方式,本质上是基于XML文件key-value的形式,可以用来存储一些简单的配置信息,例如上图所示的用户名和密码。

SharedPreferences写入步骤如下:
1)首先调用getSharedPreferences()方法获得SharedPreferences对象,提供两个参数,指定文件名和操作模式。
2)调用SharedPreference对象的edit()方法获得SharedPreferences.Editor引用对象
3)调用Edit对象的putXXX方法写入
4)调用Edit对象的apply()
在这里插入图片描述在这里插入图片描述
效果如下:在这里插入图片描述
SharedPreferences读取:通过SharedPreferences对象的get方法
在这里插入图片描述
退出应用重新打开:
在这里插入图片描述
当然这里没有考虑安全的情况,如果是在正式开发中,要对用户名密码加密存储。

SQLite数据库

SQLite是Android内置轻量级的关系数据库,支持标准的SQL语法,比起之前的两种方式更适合用来存储大量复杂的关系型数据。
安卓里为了能更方便的管理数据库,为我们提供了一个帮助类SQLiteOpenHelper:SQLiteOpenHelper是一个抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库。

1.创建数据库
首先新建MyDataBaseHelper类继承自SQLiteOpenHelper类,并实现这个抽象类的方法:

onCreate(database):首次使用应用时生成table;
onUpgrade(database,oldVersion,newVersion):在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的 版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2 或者其他与旧版本号不同的数字即可。
在这里插入图片描述
在MainActivity中构建了MyDataBaseHelper类的对象,其中第二个参数代表数据库的名称,第四个参数代表数据库版本,版本更新时将会调用onUpgrade方法。借助这个对象的getWritableDatabase方法实现数据库的创建。
在这里插入图片描述
这样在点击按钮时,系统就会检测到没有Book.db这个数据库,然后就会创建数据库并调用MyDataBaseHelper类中的onCreate方法,Book表也就创建成功了。效果图如下图所示:点击创建
在这里插入图片描述
adb查看:Book.db数据库就创建完成了
在这里插入图片描述
再看下数据库中的表:发现已经创建好Book表了
在这里插入图片描述
接下来看增加:
前面提到通过MyDataBaseHelper实例的getWritableDatabase方法可以得到SQLiteDatabase的对象,通过这个对象就可以实现对数据库的增删改查操作。
SQLiteDatabase提供了实例方法insert实现增加数据,该实例方法接受三个参数,1是数据库表名,第2个参数一般为null,第三个参数为ContentValues类,常用它put()方法以键值对的形式存储基本类型数据。
在这里插入图片描述
点击add按钮后,查看Book表,发现已经有数据:
在这里插入图片描述
删除数据:和增加数据一样,使用SQLiteDatabase对象的delete方法,第一个参数表示表名,第二第三个参数用于约束删除某一行或几行的数据的条件:
在这里插入图片描述
点击删除后,发现price>50的数据已经被删除:
在这里插入图片描述

修改数据:使用SQLiteDatabase对象的update方法,有四个参数,分别代表表名,ContentValues对象,约束,约束:
在这里插入图片描述
点击修改:name为Life的价格已经变成了66
在这里插入图片描述
查询数据库:查询方法通过SQLiteDatabase对象的query方法实现,需要至少七个参数(table, columns, selection, selectionArgs, groupBy, having, orderBy)分别是(表名,指定查询哪几列,查询哪几行,对应于前者语句中占位符的值,要group by的列名,group by后过滤条件,排序方式)。
SQLiteDatabase对象的query方法返回一个Cursor对象,查询到的数据都会从它取出。moveToFirst()将指针移动到结果集的第一行;moveToNext()代表指针顺下移动,getColumnIndex()获取某一列在表中对应位置的索引;getXXX()传入索引以获取相应位置的某种类型的数据;close()用来关闭指针。下面来查询Book表中所有数据,查询Book表中的name、price、pages三列信息:
在这里插入图片描述
结果如下:
在这里插入图片描述

更新数据库:
前面提到的MyDataBaseHelper类中还有个onUpgrade方法,更新数据库的建表语句就写在这里,然后想办法让onUpgrade被调用就好。
前面提到的新建myDataBaseHelper对象时最后一个参数为数据库版本,这里写一个比1大的数即可。

在这里插入图片描述
然后onUpgrade方法就会被执行:
在这里插入图片描述
点击增加按钮:
在这里插入图片描述

进阶

SQLite事务:数据库是面向多个用户的,例如转钱操作,多人并发访问很容易出现问题
例如A给B转钱100块,只有A账户-100,B账户+100操作才算正式完成,其中有一个条件不满足就得事务回滚,恢复操作之前的状态

在这里插入图片描述
这里finally值的是不管try有没有执行成功都会执行的语句。

猜你喜欢

转载自blog.csdn.net/weixin_42011443/article/details/106810497