Android复习笔记(8)-文件存储之数据库存储

无论是文件存储还是sp存储,都只是只能保存些简单的数据或者是键值对,如果需要保存大量复杂的关系型数据时,就会发现上面的方式不再适用,这个时候就需要使用我们Android自带的SQLite数据库了。
Android内置的数据库SQLite是一款轻量级的关系型数据库,它占用的资源很少,只需要几百KB的内存就足够,它不仅支持标准的SQL语法,还遵循数据库的ACID事务。
Android提供了SQLiteOpenHelper帮助类来帮助我们对数据库进行简单的创建和升级,它是一个抽象类,我们需要去继承它,主要是两个抽象方法,分别是onCreate和onUpgrade(),我们在这两个方法中,完成数据库的创建和升级。
(1)创建数据库
SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase(),这两个方法都可以创建或者打开一个现有的数据库(存在则打开,否则就创建),并返回一个可对数据库进行读写操作的对象,两者不同点在于:当数据库不可写入的时候,getReadableDatabase方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase方法则会出现异常。
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的即可,接收四个参数。第一个是context,有他才可以对数据库进行操作;第二个参数是数据库名,创建数据库时使用的就是这里指定的名称;第三个参数允许我们在查询数据的时候返回一个自定义的cursor,一般是传null,第四个参数表示当前的数据库版本号,可用于对数据库进行升级操作。我们拿到SQLiteHelper的实例后,再调用getReadableDatabase或getWritableDatabase方法就可以创建数据库了,当然这个时候会执行create方法,所以在create方法里处理一些创建表的逻辑,我们的数据库文件存放在/data/data/文件名/databases目录下。
SQLite数据库的数据类型:integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型,此外,primarykey 将字段指定为主键,autoincrement表示自增。
以创建book表为例
(1)编辑我们的建表语句在这里插入图片描述
(2)在create方法中执行语句
在这里插入图片描述
(3)在activity中创建数据库
在这里插入图片描述
在activity的create方法中,我们先初始化了我们自己的数据库管理类,传入了上下文对象,以及指定了数据库名称,cursor为空,数据库版本号为1,然后调用helper的getWritableDatabase方法创建了数据库。
这样我们就创建了我们的当数据库,我们可以在我们的设备管理器中查看数据库。而且当我们再次点击按钮创建数据库的时候,因为数据库已经存在,所以不会再次执行创建操作。
我们查看数据库操作,使用adb命令来进行查看。
(2)升级数据库
我们继承SQLiteDatabaseHelper中继承了两个方法,一个是create,另一个是upgrade,一个进行创建,一个是负责升级的。
以我们之前的book表为例,现在新添一个category表,同样是写建表语句,然后create方法中执行db。execSQL(建表语句),但是当我们点击按钮时发现,我们的category表并没有创建成功,很容易理解,因为之前我们的book表已经创建过,所以我们的create方法不会再次创建,那么怎么办呢,卸载程序,再次运行,就会发现两张表都出现了,因为我们卸载程序,我们的数据库文件就不存在了,所以,需要再次运行create方法。这样虽然解决了我们的问题,但是,每次更新都要卸载再运行,会很麻烦,所以我们使用upgrade方法来进行更新,我们在upgrade方法中执行语句:drop table if exists 表名,drop语句,如果发现数据库中已经存在表,就删除表,然后我们在upgrade方法中重新调用create方法来创建,但是怎么让upgrade方法执行,这时候,就到了我们创建数据库时,第四个参数,数据库的版本号上场了,当我们的数据库版本发生变化时,我们的upgrade方法就会被调用。
(3)添加数据
数据库的操作无非就是四种,即CRUD,c代表(create)添加,r代表(retrieve)查询,u代表(update)更新,d代表删除(delete),每一种操作又对应一种SQL命令,添加数据用insert,查询数据用select,更新数据用update,删除数据用delete,Android为我们提供了一些辅助性方法来帮助我们完成crud操作。
向数据库中添加数据是insert方法,insert方法有三个参数,第一个参数是表名,指定我们添加数据到哪张表,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般用不到,直接传null,第三个参数是一个contentValue对象,它提供了一系列的put方法重载,用于向contentvalues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
(1)拿到数据库帮助类实例
在这里插入图片描述
(2)创建或者更新数据库,拿到数据库实例
在这里插入图片描述
(3)初始化contentvalue
在这里插入图片描述
(4)向contentvalue中添加数据
在这里插入图片描述
(5)执行insert方法
在这里插入图片描述
如果需要插入第二条数据,需要在第一条数据插入后,执行contentvalue的clear方法,然后再接着执行contentvalue的添加数据方法,和数据库的插入方法。
(4)更新数据
android更新数据库使用update方法,接收4个参数,第一个参数和insert一样,也是表名,指明更新哪张表,第二个参数是contentvalue对象,把要更新的数据装载进去,第三和第四参数为约束条件,不指定的话就是更新所有行。
同理,先获取数据库对象SQLiteDatabase,然后初始化contentvalue对象,然后添加数据,然后调用update方法
在这里插入图片描述
在这里插入图片描述
如上面例子所示:我们指明更新book表,然后在content value对象中添加了price为10.99 的数据,并指明限定条件为name=the da vinci code的选项。
(5)删除数据
我们使用delete方法删除数据,删除方法接收三个参数,第一个为表名,不用多说;第二三个参数用于限定删除某一行或者某几行的数据,不指定的话就是默认删除所有行。
在这里插入图片描述
拿到数据库对象,指明要删除book表中pages>500的条目。
(6)查询条目
这是四种操作的最后一种操作了,SQL的全称是 structured query language,翻译成中文就是结构化查询语言,它的大部分功能都体现在查上。我们使用query方法来进行数据查询,query方法非常复杂,最短的一个方法重载,也要七个参数
在这里插入图片描述
第一个参数是表名,第二个参数指定查询哪几列,不指定就查询所有列;第三四个参数用于约束查询某一行或者某几行的数据,不指定就查询所有行的数据,第五个参数用于指定需要去 group by的列,不指定就表示不进行 group by操作,第六个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤,第七个参数用于指定查询结果的排序方式,不指定则使用默认的排序方式,我们使用query方法返回一个cursor对象,我们的所有数据都从cursor对象中取出。
首先,获取SQLiteDatabase对象。
在这里插入图片描述
因为我们所有的增删改查方法都是由SQLiteDatabase对象来调用的。
然后调用query方法得到cursor对象
在这里插入图片描述
从cursor中取出查询的数据
遍历cursor对象
在这里插入图片描述
使用cursor,需要在使用完之后,调用close方法,关闭。通过调用moveToFirst方法将数据的指针移到第一行分位置,然后进入循环,遍历数据,在这个循环中可以通过cursor的getColumnIndex()方法获取到某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值