第一行代码 学习笔记 数据储存全方案

6.1持久化技术简介

Android系统中主要提供了3种方式用于简单地实现数据持久化功能,即文件储存,SharedPreFerence储存以及数据库储存,当然,除了这3种方式之外,你还可以将数据保存在手机地SD卡中,不过使用文件,SharedPreference或数据库来保存数据会相对简单一点,而且比起将数据保存在SD卡中会更加安全

6.2文件储存

文件储存是Android中最基本地一种数据储存方式,它不对储存地内容进行任何地格式化处理,所有数据都是原封不动地保存到文件中,所以它比较适合用于储存一些简单地文本数据或二进制数据

6.2.1 将数据存储到文件中



下面通过实例来了解一下



6.2.2从文件中读取数据


以一段代码为例子


了解了从文件中读取数据的方法,那么我们就来完善一下上一小节的例子



6.3 SharePreferences存储

  不同于文件的储存方式,SharedPreferences是使用键值对的方式来储存数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持多种不同的数据类型储存。

6.3.1 将数据存储到SharedPreferences中

   想要使用SharedPreferences来存储数据,首先需要获取到SharePreferences对象。Android中主要提供了3种方法用于得到SharePreferences对象。


(1)调用SharedPreferences对象的edit()方法来获取一个SharedPreferencesEditor对象。

(2)向SharePreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,以此类推

(3)调用apply()方法将添加的数据提交,从而完成数据存储操作。

接下来通过一个实例来了解一下


6.3.2从SharedPreferences中读取数据


6.3.3实现记住密码功能



6.4 SQLite数据库存储

前面所学的文件储存呵SharedPreferences存储毕竟只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候就需要使用数据库来解决。

6.4.1创建数据库

    Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

首先要知道SQLiteOpenHelper是一个抽象类,这意味着如果想要使用它的话,就需要创建一个自己的帮助类去继承它,SQLiteOpenHelper中有两个抽象的方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个中去实现创建,升级数据库的逻辑。

 SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将只是读的方式去打开数据库,而getWritableDatabase()方法则会出现异常

SQLiteOpenHelper中有两个构造方法可以重写,一般使用参数少一点的那个构造方法就行。这个构造方法中接收四个参数,第一个参数是Context,第二个参数是数据库名,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例后,再调用它的getReadableDatabase()或getWritableFatabase()方法就能够创建数据库了,此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑

接下来用一个实例了解一下



6.4.2 升级数据库

错误示例


原因:因为在此之前BookStore.db数据库已经存在,之后不管怎么点击Create database按钮,MyDatabaseHelper中的onCreate()的方法都不会再次执行

解决方法



6.4.3添加数据

对数据进行的操作无非就四种,即CRUD.C代表添加(Create),R代表查询(Retrieve),U代表更新(Updata),D代表删除(Delete)。

Android提供了一系列的辅助性方法,使得在Android中即使不去编写SQL语句,也能轻松完成所有的CRUD操作。

前面我们已经知道,调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法是可以用于创建和升级数据库的,不仅如此,两个方法都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作。

那么我们首先学习一下如何向数据库的表中添加数据

SQLiteDatabase中提供了一个insert()方法,这个方法是专门用来添加数据的。它接收3个数据,第一个参数是表名,第二个参数用于在未指定添加数据的情况下给某些可空的列自动赋值为NULL,一般用不到这个功能,直接传入null,第三个参数是一个ContentValues对象,提供了一系列的put()方法重载,用于向ContentValues中添加数据


这里只对Book表里其中四列数据进行组装,id那一列并没有赋值,这是因为在前面创建表的时候,就将id列设置了自增长,它的值会在入库的时候自动生成

6.4.4 更新数据

SQLiteDatabase提供了一个update()方法,用于对数据进行更新,这个方法接收四个参数,第一个是表明,第二个参数是ContentValues对象,第三和第四个参数用于约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行


6.4.5删除数据

SQLiteDatabase中提供了一个delete方法,专门用于删除数据,这个方法接收3个参数,第一个参数是表名,第二,第三个参数是用于约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。

 

6.4.6 查询数据

SQLiteDatabase中提供了一个query()方法用于对数据进行查询。这个方法的参数非常复杂,最短的一个方法重载也需要传入7个参数,第一个参数是表名,第二个参数用于指定去查询哪几列,如果不指定则默认查询所有的列。第三,第四个参数用于约束查询某一行或某几行的数据,不指定则默认查询所有行的数据。第五个参数用于指定需要去group by的列,不指定则表示比对查询结果进行groub by操作。第六个参数用于对group by之后的数据进行进一步过滤,不指定则宝石不进行过滤。第七个参数用于指定查询结果的排列方式,不指定则表示使用默认的排序方式。


调用query()方法后会返回一个Cursor对象,查询到的所有数据都将从这个对象中取出


6.4.7使用SQL操作数据库

虽然Android已经给我们提供了很多非常方便的API用于操作数据库,同样也给我们提供了一系列的方法,使得可以直接通过SQL来操作数据库。

下面演示一下如何直接用SQL来完成前面几小节中学过的CRUD操作

添加数据的方法如下

db.execSQL("insert into Book(name.author.pages,price)values(?,?,?,?)",new String[]{The Da Vinnci Code","Dan brown","454","16.93"});

db.execSQL("insert into Book(name.author.pages,price)values(?,?,?,?)",new String[]{The Lost Symbol","Dan brown","510","19.95"});

更新数据的方法如下:

db.execSQL("update Book set price = ? where name = ?",new String[] {"10.99","The Da Vinci Code" });

删除数据的方法如下

db.execSQL("delete from Book where pages > ?", new String[]{"500"});

查询数据的方法如下:

dbrawQuery("select * from Book",nul);

6.5 使用LitePal操作数据库

6.5.1LitePal  简介

   LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。

6.5.2 配置LitePal

只需在app/build.gradle文件中声明该开源库就可以引用了


接下来需要配置litepal.xml文件。右击app/src/main目录——New——Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件中的内容,如下所示:


最后还需要配置一下LitePalAPPlication,修改AndroidManifest.xml中的代码:


6.5.3 创建和升级数据库

LitePal采取的是对象关系映射(ORM)的模式,那么什么是对象关系映射呢?简单来说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射了。

对象关系映射赋予了我们一个强大的功能,就是可以用面向对象的思维来操作数据库,而不用再和SQL语句打交道。



Book类就会对应数据库中的Book表,而类中的每一个字段分别对应了表中的每一个列,



Litepal来升级数据库非常简单,只需要再类中修改向该的内容,然后将版本号加1就行了。Litepal会自动帮我们保存之前表中的所有数据。

6.5.4 使用LitePal添加数据

Litepal进行表管理操作时不需要模型类有任何的继承结构,但是进行CRUD操作时就不行了,必须要继承自DataSupport类才行。



6.5.5 使用LitePal更新数据

更新数据比添加数据稍微复杂一点,因为它的API接口比较多,这里我们只介绍最常用的几种更新方式。

  首先,最简单的一种更新方式就是对已存储的对象重新设值,然后重新调用save()方法就可以了。这里我们了解一下什么是已存储的对象?

对LitePal来说,对象是否已存储就是根据调用model.isSaved()方法的结果来判断的,返回true就表示已存储,返回false就表示未存储。

实际上只有两种情况下model,isSaved()方法才会返回true,一种情况是已经调用过model.save()方法去添加数据了,返回model会被认为是已存储的对象。另一种情况是model对象是通过Litepal提供的查询API查出来的,由于是从数据库中查到的对象,因此也会被认为是已存储的对象。



在使用updateAll()方法时,还有一个非常重要的知识的,就是当把一个字段的值更新为默认值时,是不可以使用上面的方式来set数据的。对于所有想要将数据更新围殴默认值的操作,LitePal统一提供了一个setToDefault()方法,然后传入相应的列名就可以了。比如这样写

Book book=new Book();

book.setToDefault("pages");

book.updateAll();

这段代码的意思是,将所有书的页数都更新为0,因为updateAll()方法中没有指定约束条件,因此更新操作对所有数据都生效。

6.5.6  使用   LitePal删除数据

  使用LitePal删除数据的方式主要有两种

第一种:直接调用已存储对象的delete()方法就可以了。

第二种:


6.5.7 使用LitePal查询数据

使用LitePal完成查询这张表种所有的数据,只需这么写

List<Book>books=DataSupport.findAll(Book.class)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值