第三方库之 LitePal

2021-07-13  本文已影响0人  Kevin_小飞象

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

基本用法

  1. 在 build.gradle 添加依赖:
    // 数据库
    implementation 'org.litepal.guolindev:core:3.2.3'
  1. 在 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>
  1. 配置 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方法 
    ...
}
  1. 修改 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"); 

  1. 方法一:
//第一步,查找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数据库高手秘籍

上一篇下一篇

猜你喜欢

热点阅读