LitePal 简单使用
配置LitePal
添加依赖
在我们的build.gradle
文件下的dependencies
下面添加
implementation 'org.litepal.guolindev:core:3.2.3'
如图:
传递Context变量
但我们用原生的Sql语句进行数据存储的时候,我们需要进行大量的传递Context变量,确实很麻烦,当时litepal完全省略了这些麻烦的过程,我们只需要在AndroidManifest文件中配置一下代码
android:name="org.litepal.LitePalApplication"
创建assets资源文件夹
1 你的Android切换成Project,2选中你的Model右键–>New–>Directory然后输入assets然后选择src/main/assets
2.在assets文件夹下创建litepal.xml文件夹
3.把一下代码复制进litepal.xml文件中
<?xml version="1.0" encoding="UTF-8" ?>
<litepal>
<!-- 数据库名称-->
<dbname value="db_weather"/>
<!-- 数据库版本-->
<version value="1"/>
<!-- 在mapping中引用数据库表的完整类名,用于创建数据库表,有几张表就需要有几个mapping-->
<list>
<mapping class="com.litepal.datatable.City"/>
</list>
</litepal>
4.创建表,就是创建一个类,如我想创建一个City表,我就添加一个CIty类,并把City的完成类名添加到litepal.xml文件中
以上配置已基本完成,下面就需要创建数据库了
创建数据库
调用一下代码,数据库就创建完成了
SQLiteDatabase db = Connector.getDatabase();
至此数据库应该已经创建完成,我们在Android studio 中打开Device File Explorer
找到我们的data
然后在打开data
之后就可以看到我们多出一个com.litepal
(看你自己的包名)
修改数据库表
当我们创建完数据库表,但是发现创建错了,需要添加新表,或者需要修改原有数据库表的字段,怎么办呢?
1.例如我想添加一个新的Comment表怎么办呢,首先和刚才一样,创建一个Comment类,并把Comment类的完整类名添加到litepal.xml文件中。
2.把版本号加1(在表中添加新字段和此步骤一样
)
3.在重现调用一下SQLiteDatabase db = Connector.getDatabase();
代码数据库就就修改完成了
删除数据库
直接把litepal.xml文件中对这个表的类引用删除,然后把version的value加1即可
建立表关联
表与表之间的对应关系,分为一对一,多对一,多对多关系,但我们需要用litepal
,怎么建立这种关系呢?
其实litepal创建表是通过类来映射的,一个类就是一张表,那这样我们就好办了,我们可以通过类与类之间的关联,来建立表与表的关联.
例如,一条新闻只能对应一条导语,那我们直接在新闻中引用一下导语
例如
或者也可以在导语类中引用新闻类
那多对一关系又怎么办呢?
例如一条新闻可以包含多条评论,但是一条评论只能对应一条新闻,我们可以再新闻中引用一个评论的集合,在评论中引用新闻就可以啦
评论类:
新闻类:
再比如 多对多关系又怎么办呢,聪明的你肯定想到了,那就是在各自的类中相互引用对方的集合
一条新闻可以是多种类别,一个类别可以包含多条新闻
新闻类:
类别类:
数据库操作
在进行数据库操作之前,我们需要对数据库表的类进行一下继承
,他们需要继承自LitePalSupport
类
插入
插入数据非常简单,真的你要相信我,我都被他吓的大吃一惊
News news=new News();
news.setTitle("我是一条新闻");
news.setContent("我是新闻内容");
news.save();
对,到此已经结束了,已经保存到数据库了,真的,要相信自己
当时他的功能不仅如此
他还有返回值
news.save();的返回值是boolean值
news.saveThrows();如果存储失败会抛出异常,需要用try catch处理
那么多对一关系到底是怎么是怎么插入的呢?
例如;我们有两条评论对应一条新闻
Comment comment1 = new Comment();
comment1.setContend("好评");
comment1.setPublishDate(System.currentTimeMillis());
comment1.save();
Comment comment2 = new Comment();
comment2.setContend("好评");
comment2.setPublishDate(System.currentTimeMillis());
comment2.save();
News news = new News();
news.setTitle("我是二条新闻");
news.setContent("我是新闻内容");
news.getCommentList().add(comment1);//建立对应关系
news.getCommentList().add(comment2);//建立对应关系
news.setCommentCount(news.getCommentList().size());
if (news.save()) {
Toast.makeText(this, "我的编号是" + news.getId(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "存储失败", Toast.LENGTH_SHORT).show();
}
但我们有一个news的集合我们怎么插入呢?litepal给我们提供了一个saveAll()的方法
List<News> newsList;
...
DataSupport.saveAll(newsList);
删除
LitePal.deleteAll(Class<?> modelClass, String... conditions)
//返回值是删除数据的条数,
//第一个参数是类名
//第二个参数是 String型的数组,相当于where 后面的语句
例如我想删除title="我爱晏传利"并且content="就是爱你"的新闻
LitePal.deleteAll(News.class,"title=? and content=?","我爱晏传利","就是爱你");
这样子就可以了
注意:当有外键的时候,把本条数据删除了,和外键相关联的数据也会一并删除
更改
LitePal.updateAll(Class<?> modelClass, String... conditions)
//返回值是修改数据的条数,
//第一个参数是类名
//第二个参数是 String型的数组,相当于where 后面的语句
用法和删除一样
查询
查询第一条数据
News news=findFirst(News.class)
查询最后一条数据
News news =LitePal.findLast(News.class);
查询所有数据
ArrayList<News> newsList = (ArrayList) (LitePal.findAll(News.class));