首页 理论教育 DataSupport类的数据库操作方法详解

DataSupport类的数据库操作方法详解

时间:2023-06-27 理论教育 版权反馈
【摘要】:继承了DataSupport类之后,这些实体类就拥有了进行CRUD操作的能力若要存储一条数据到News表中,可以进行如下操作。News lastNews=DataSupport.findLast;把News表中id为1、3、5、7的数据查找出来,代码如下。List<News>newsList=DataSupport.findAll;查询News表中所有评论数大于零的新闻,代码如下。例如,想把News表中id为2的记录的标题改成“今日iPhone6发布”,代码如下。

DataSupport类的数据库操作方法详解

LitePal中与存储相关的API其实并不多,但用法颇为丰富,而且相比于传统的insert()方法,使用LitePal存储数据简单到让人惊叹。下面完整地介绍LitePal存储数据的方法。

1.插入记录

LitePal要求所有的实体类都要继承自DataSupport这个类,因此,这里我们要把继承结构加上。修改News类的代码,如下所示。

978-7-111-58810-8-Chapter06-67.jpg

继承了DataSupport类之后,这些实体类就拥有了进行CRUD操作的能力若要存储一条数据到News表中,可以进行如下操作。

(1)修改布局文件,增加INSERT按钮,如图6-16所示。

978-7-111-58810-8-Chapter06-68.jpg

图6-16 增加INSERT按钮

(2)在INSERT按钮的监听器中增加以下代码。

978-7-111-58810-8-Chapter06-69.jpg

这种方法非常简单,不需要SQLiteDatabase,也不需要ContentValues,更不需要通过列名组装数据,甚至不需要指定表名,只需要新建一个News对象,然后把要存储的数据通过setter方法传入,最后调用save()方法即可,而这个save()方法就是从DataSupport类中继承而来的,如图6-17所示。

978-7-111-58810-8-Chapter06-70.jpg

图6-17 插入记录

除此之外,save()方法是有返回值的,我们可以根据返回值判断存储是否成功,代码如下。

978-7-111-58810-8-Chapter06-71.jpg

2.查询数据

(1)使用LitePal查询News表中id为1的这条记录,代码如下。

News news=DataSupport.find(News.class,1);

(2)获取News表中的第一条数据,代码如下。

News firstNews=DataSupport.findFirst(News.class);

(3)获取News表中的最后一条数据,代码如下。

News lastNews=DataSupport.findLast(News.class);

(4)把News表中id为1、3、5、7的数据查找出来,代码如下。

List<News>newsList=DataSupport.findAll(News.class,1,3,5,7);

(5)把News表中所有数据查找出来,代码如下。

List<News>newsList=DataSupport.findAll(News.class);

(6)查询News表中所有评论数大于零的新闻,代码如下。

978-7-111-58810-8-Chapter06-72.jpg

首先调用了DataSupport的where()方法,在这里指定查询条件。where()方法接收任意个字符串参数,其中第一个参数用于进行条件约束,从第二个参数开始,都用于替换第一个参数中的占位符。这个where()方法对应了一条SQL语句中的where部分。

(7)查询News表中的title和content这两列数据,也是很简单的,我们只要再增加一个连缀即可。

978-7-111-58810-8-Chapter06-73.jpg

(8)若要将查询出的新闻按照发布的时间倒序排列,即最新发布的新闻放在最前面,则编写如下代码。(www.xing528.com)

978-7-111-58810-8-Chapter06-74.jpg

(9)若要只查询前10条数据,使用连缀同样可以轻松解决这个问题,代码如下。

978-7-111-58810-8-Chapter06-75.jpg

3.表关联

LitePal的存储功能显示不仅仅只有这些用法,事实上,LitePal在存储数据的时候默默帮我们做了很多的事情,比如多个实体类之间有关联关系的话,我们不需要考虑在存储数据的时候怎样建立数据与数据之间的关联,因为LitePal已经帮我们完成了,步骤如下。

(1)在Comment类中声明一个News实例,这样就清楚地表示出News中可以包含多个Comment,而Comment中只能有一个News,也就是多对一的关系。在News类增加一行代码,并自动生成get、set方法。

978-7-111-58810-8-Chapter06-76.jpg

(2)在INSERT按钮的监听器中修改代码如下。

978-7-111-58810-8-Chapter06-77.jpg

978-7-111-58810-8-Chapter06-78.jpg

可以看到,这里先是存储了一条comment1数据,然后存储一条comment2数据,接着在存储News之前把刚才的两个Comment对象添加到News的commentList列表当中,这样就表示这两条Comment是属于这个News对象的,最后再把News存储到数据库中,这样它们之间的关联关系即自动建立。

(3)前面介绍通过sqlite3命令可以查看数据库,除此之外,还可以在手机上直接查看,查看软件是RootExplorer,使用RootExplorer要求获取手机的Root权限,安装并打开软件之后,在/data/data/包名/databases中单击News.db数据库,选择内置数据库查看器,然后随便单击一张表即可查看其中的数据,如图6-18所示。

第二条新闻已经成功存储到News表中,这条新闻的id是2。那么,从哪里可以看出关联关系呢?多对一关联的时候,外键是存放在多方的,因此我们要到Comment表中查看关联关系,如图6-19所示。

978-7-111-58810-8-Chapter06-79.jpg

图6-18 News表

978-7-111-58810-8-Chapter06-80.jpg

图6-19 Comment表

可以看到,两条评论都已经成功存储到Comment表中,并且这两条评论的news_id都是2,说明它们是属于第二条新闻的。

4.使用LitePal修改数据

LitePal修改数据的API比较简单,并没有太多的用法,也比较容易理解,方法都是定义在DataSupport类中的,方法定义如下。

public static int update(Class<?>modelClass,ContentValues values,long id)

这个静态的update()方法接收三个参数,第一个参数是Class,传入我们要修改的那个类的Class,第二个参数是ContentValues对象,第三个参数是一个指定的id,表示要修改哪一行数据。

例如,想把News表中id为2的记录的标题改成“今日iPhone6发布”,代码如下。

978-7-111-58810-8-Chapter06-81.jpg

5.使用LitePal删除数据

LitePal删除数据的API和修改数据比较类似,但是更加简单,我们先来看一下DataSup-port类中的方法定义,如下所示。

public static int delete(Class<?>modelClass,long id)

delete()方法接收两个参数,第一个参数是Class,传入我们要删除的那个类的Class,第二个参数是一个指定的id,表示我们要删除哪一行数据。

例如,想删除News表中id为2的记录,代码如下。

DataSupport.delete(News.class,2);

需要注意的是,这不仅仅会将News表中id为2的记录删除,同时还会将其他表中以Newsid为2的这条记录作为外键的数据一起删除,因为外键若不存在,这条数据也没有保留的意义。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈