第三方库之 LitePal
2021-07-13 本文已影响0人
Kevin_小飞象
目前最新版本是 3.2.3。
GitHub:LitePal
基本用法
- 在 build.gradle 添加依赖:
// 数据库
implementation 'org.litepal.guolindev:core:3.2.3'
- 在 assets 配置 litepal.xml
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="lottery" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.hk.hktlottery.db.Prize"></mapping>
</list>
</litepal>
- 配置 LitePalApplication
/**
* Created on 2021/6/22 14:16
*
* @author Gong Youqiang
*/
public class MyApp extends LitePalApplication {
private static Application mApplication;
@Override
public void onCreate() {
super.onCreate();
mApplication = this;
LitePal.initialize(this);
//获取到SQLiteDatabase的实例,创建数据库表
SQLiteDatabase db = LitePal.getDatabase();
}
public static Context getAppContext() {
return mApplication;
}
}
开始建表
- Prize.java
/**
* Created on 2021/7/12 10:21
*
* @author Gong Youqiang
*/
public class Prize extends LitePalSupport {
@Column(unique = true)
private int id;
@Column(nullable = false)
private String level;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private int num;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
升级表
- Comment.java
public class Comment extends LitePalSupport {
private int id;
private String content;
// 自动生成get、set方法
...
}
- 修改 litepal.xml 中的配置,在映射列表中新增 Comment 类,并将版本号加 1
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="lottery" ></dbname>
<version value="2" ></version>
<list>
<mapping class="com.hk.hktlottery.db.Prize"></mapping>
<mapping class="com.hk.hktlottery.db.Comment"></mapping>
</list>
</litepal>
增删改查
- 增
Prize prize = new Prize();
prize.setId(list.size());
prize.setLevel("一等奖");
prize.setName("奖励 100 元");
prize.setNum(1);
prize.save(); //这一句代码就是将一条记录存储进数据库中
- 删
// 删除单个记录,id=1
LitePal.delete(Prize.class,1);
//删除数据库中Prize表的所有记录
LitePal.deleteAll(Prize.class);
//删除数据库Prize表中duration大于3500的记录
LitePal.deleteAll(Prize.class, "duration > ?" , "3500");
- 改
方法一:
//第一步,查找id为1的记录
Movie movie = LitePal.find(Movie.class, 1);
//第二步,改变某个字段的值
movie.setPrice(4020f);
//第三步,保存数据
movie.save();
方法二:
Movie movie=new Movie();
movie.setName("2Diots");
movie.setDirector("某人");
//直接更新id为1的记录
movie.update(1);
方法三:
Movie movie=new Movie();
movie.setDirector("someone");
//更新所有name为2Diots的记录,将director字段设为someone
movie.updateAll("name = ?", "2Diots");
Movie movie=new Movie();
movie.setName("someone");
movie.setDirector("someone");
//将更新所有name为2Diots,director为gpf的记录name和director均改为someone
movie.updateAll("name=? and director=?", "2Diots","gpf");
- 查
//查找movie表的所有记录,返回值是一个泛型为Movie的List集合
List<Movie> allMovies = LitePal.findAll(Movie.class);
//查找movie表id为1的记录
Movie movie = LitePal.find(Movie.class,1);
// 比如获取news表中的第一条数据
News firstNews = LitePal.findFirst(News.class);
// 获取News表中的最后一条数据
News lastNews = LitePal.findLast(News.class);
// 想把news表中id为1、3、5、7的数据都查出来
List<News> newsList = LitePal.findAll(News.class, 1, 3, 5, 7);
// 或者
long[] ids = new long[] { 1, 3, 5, 7 };
List<News> newsList = LitePal.findAll(News.class, ids);
//查找name为2Diots的记录,并且以时长作排序,where()方法接收任意个字符串参数,其中第一个参数用于进行条件约束,
//从第二个参数开始,都是用于替换第一个参数中的占位符的。那这个where()方法就对应了一条SQL语句中的where部分。
List<Movie> movies = LitePal.where("name = ?", "2Diots").order("duration").find(Movie.class);
// 但是这样会将news表中所有的列都查询出来,也许你并不需要那么多的数据,而是只要title和content这两列数据。那么也很简单,我们只要再增加一个连缀就行了,如下所示:
List<News> newsList = LitePal.select("title", "content")
.where("commentcount > ?", "0").find(News.class);
//将查询出的新闻按照发布的时间倒序排列,即最新发布的新闻放在最前面,那就可以这样写:
List<News> newsList = LitePal.select("title", "content")
.where("commentcount > ?", "0")
.order("publishdate desc").find(News.class);
//order()方法中接收一个字符串参数,用于指定查询出的结果按照哪一列进行排序,asc表示正序排序,desc表示倒序排序,因此order()方法对应了一条SQL语句中的order by部分。
//也许你并不希望将所有条件匹配的结果一次性全部查询出来,因为这样数据量可能会有点太大了,而是希望只查询出前10条数据,那么使用连缀同样可以轻松解决这个问题,代码如下所示:
List<News> newsList = LitePal.select("title", "content")
.where("commentcount > ?", "0")
.order("publishdate desc").limit(10).find(News.class);
//limit()方法接收一个整型参数,用于指定查询前几条数据,这里指定成10,意思就是查询所有匹配结果中的前10条数据。
//刚才我们查询到的是所有匹配条件的前10条新闻,那么现在我想对新闻进行分页展示,翻到第二页时,展示第11到第20条新闻,只需要再连缀一个偏移量就可以了,如下所示:
List<News> newsList = LitePal.select("title", "content")
.where("commentcount > ?", "0")
.order("publishdate desc").limit(10).offset(10)
.find(News.class);
//这里指定成10,就表示偏移十个位置,那么原来是查询前10条新闻的,偏移了十个位置之后,就变成了查询第11到第20条新闻了,如果偏移量是20,那就表示查询第21到第30条新闻
//查找所有年龄小于25岁的人
List<Person> person = LitePal.where("age < ?", 25).find(Person.class);
参考:
Android数据库高手秘籍