第三方开源库--> LitePal 数据库

Posted Kevin_小飞象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三方开源库--> 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); 

推荐文献:
Android数据库高手秘籍

以上是关于第三方开源库--> LitePal 数据库的主要内容,如果未能解决你的问题,请参考以下文章

第三方库SDK混淆总结

android项目中使用开源数据库litepal

LitePal数据库的基本操作

Android的LitePal数据库ORM使用总结(避坑指南)

Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

Android数据存储——开源LitePal方法操作数据库