0
点赞
收藏
分享

微信扫一扫

【Android -- 开源库】LitePal 数据库

目前最新版本是 3.2.3。
GitHub:​​​LitePal​​

基本用法

1. 在 build.gradle 添加依赖:

// 数据库
implementation 'org.litepal.guolindev:core:3.2.3'

2. 在 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>

3. 配置 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;
}

}

开始建表

1. 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;
}
}

升级表

1. Comment.java

public class Comment extends LitePalSupport {

private int id;

private String content;

// 自动生成get、set方法
...
}

2. 修改 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>

增删改查

1. 增

Prize prize = new Prize();
prize.setId(list.size());
prize.setLevel("一等奖");
prize.setName("奖励 100 元");
prize.setNum(1);
prize.save(); //这一句代码就是将一条记录存储进数据库中

2. 删

// 删除单个记录,id=1
LitePal.delete(Prize.class,1);

//删除数据库中Prize表的所有记录
LitePal.deleteAll(Prize.class);

//删除数据库Prize表中duration大于3500的记录
LitePal.deleteAll(Prize.class, "duration > ?" , "3500");

3. 改
方法一:

//第一步,查找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");

4. 查

//查找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);

举报

相关推荐

0 条评论