安卓项目实战之:数据库框架 LitePal 3.0 的使用详解

LitePal简介

LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作,并且LitePal很“轻”,jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别。

GitHub : http://github.com/LitePalFramework/LitePal
LitePal的使用

1.添加依赖
在app/build.gradle文件中添加compile依赖如下:

dependencies {
    compile 'org.litepal.android:java:3.0.0'
}

    1
    2
    3

2.在assets目录下创建litepal.xml配置文件
项目文件夹下New->Folder->Assets Folder创建相应的assets文件夹,然后在assets文件夹下创建一个名为litepal.xml的文件,编辑文件如下:



               // 数据库名称为litepaldemo,默认以 .db 结尾,如未以此结尾,则自动添加。
                        // 数据库版本为1,每次数据库发生变动版本号必须+1
                                       // 有几张表就在list之间写几个mapping
      // list标签中的实体类都应该继承LitePalSupport这个类,这个千万别忘记
      
        
      
  
                           
     //storage 定义数据库文件存储的地方,可选 internal(内部) 和 external(外部), 默认为 internal

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

3.在Application中初始化
在自己的application中加入一行代码即可:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化
        LitePal.initialize(this);
    }  
 ...
 }

    1
    2
    3
    4
    5
    6
    7
    8
    9

经过上面3步的配置,LitePal就已经集成成功并可以正常使用了。

4.实体类创建

/**
* 从LitePal 2.0.0版本开始建议使用继承LitePalSupport类,
* DataSupport类已经被标为了废弃,虽然暂时还可以正常工作,但是不建议再继续使用了
*/
public class Movie extens LitePalSupport{
    //运用注解来为字段添加index标签
    
    //name是唯一的,且默认值为unknown
    @Column(unique = true, defaultValue = "unknown")
    private String name;
    
    //忽略即是不在数据库中创建该属性对应的字段
    @Column(ignore = true)
    private float price;
    
    private byte[] cover;
    private int duration;
    
    //不为空
    @Column(nullable = false)
    private String director;
    
    private String type;
    
    //记得添加所有字段的getter和setter方法
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

注意:

    不管实体类中有没有id这个属性,都会默认创建一个为整型的id字段,作为自增的主键
    如果实体类中有一个字段名为id,那么类型只能为int或者long
    id字段的值始终为当前记录的行号(下标从1开始),即使我们在实体类中定义了int或者long类型的id字段,在添加数据时人为的设置id的值为100,等其他值,查询数据库发现该id字段的值设置是无效的,她始终等于该条记录所在的行id,即第几条记录。
    所有的column注解总共有四个,defaultValue的默认值为空字符,所以这个注解只能用以是String类型的字段,即字符型才有默认值
    litepal支持的实体类字段映射类型为 int,long,double,float,byte[],boolean,String,Date;不支持String[]数组型

数据库增删改查操作

1.存储操作

Movie movie1=new Movie();
  movie1.setId(1002);
  movie1.setName("东成西就");
  movie1.setDirector("刘镇伟");
  movie1.setDuration(100);
  movie1.setType("喜剧");
//这一句代码就是将一条记录存储进数据库中
movie1.save();

    1
    2
    3
    4
    5
    6
    7
    8

save()方法是有返回值的,返回true代表添加成功,返回flase代表添加失败。
save()是添加一条数据,批量添加是 LitePal.saveAll(persons);

2.删除记录

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

//删除数据库movie表中id为1的记录
LitePal.deleteAll(Movie.class,1);

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

    1
    2
    3
    4
    5
    6
    7
    8

3.修改记录
方法一:

//第一步,查找id为1的记录
Movie movie = LitePal.find(Movie.class, 1);
//第二步,改变某个字段的值
movie.setPrice(4020f);
//第三步,保存数据
movie.save();

    1
    2
    3
    4
    5
    6

方法二:

Movie movie=new Movie();
movie.setName("2Diots");
movie.setDirector("某人");
 //直接更新id为1的记录
 movie.update(1);

    1
    2
    3
    4
    5

方法三:

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");

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

4.查询记录

//查找movie表的所有记录,返回值是一个泛型为Movie的List集合
List allMovies = LitePal.findAll(Movie.class);

//查找movie表id为1的记录
Movie movie = LitePal.find(Movie.class,1);

//查找name为2Diots的记录,并且以时长作排序
List movies = LitePal.where("name = ?", "2Diots").order("duration").find(Movie.class);

//查找所有年龄小于25岁的人
List person = LitePal.where("age < ?", 25).find(Person.class);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

混淆配置

-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.LitePalSupport{
    *;
}

    1
    2
    3
    4
    5
    6
    7

使用LitePal来完成升级表的操作:

包括新增一张表,新增表中的一个字段,删除表中的一个字段,删除表等,每一次的升级操作litepal.xml文件中数据库的版本号都必须加1.
具体升级操作见博客:
https://blog.csdn.net/guolin_blog/article/details/39151617
使用LitePal来建立表之间的关联关系:

在数据库中表与表之间的关联关系一共有三种类型:一对一,一对多,多对多,下面分情况讨论:
一对一:

例如新闻表News和简介表Introducation,一条新闻只能对应一条简介,同时一条简介也只能属于一条新闻。
一对一关系的体现:
在编程语言中:只需要在News类中持有一个Introduction类的引用,然后在Introduction类中也持有一个News类的引用,这样它们之间自然就是一对一的关系了:
在这里插入图片描述
就是这么简单,在News类中可以得到一个对应的Introduction的实例,那么它们之间就是一对一关系了。
在数据库表中的体现:使用外键,并且外键加在任意哪一张表上都可以。
一对多:

例如新闻表News和评论表Comment,一条新闻可以有多条评论,但是一条评论只能属于一条新闻。
一对多关系的体现:
在编程语言中:java中有List,Set等集合类来建立对象之间的一对多关系,只需要在一的一方即News类中创建一个集合类型并且泛型是Comment的成员变量即可。
在这里插入图片描述
在这里插入图片描述

在数据库表中的提现:也是使用外键,但是外键只能加在多方的表中。
多对多:

例如新闻表News和种类表Category,一条新闻可能属于不同的种类,同样的一种种类下也可以有多条新闻。
多对多关系的体现:
在编程语言中:只需要在News类中使用集合类声明拥有多个Category,然后在Category类中也使用集合类声明拥有多个News就可以了。
在这里插入图片描述
在这里插入图片描述
在数据库表中的体现:多对多关系不能使用外键来表示,必须借助于中间表,中间表主要用来存放News表和category表之间的关联关系。

针对以上表和表之间的关联关系,如果建表的时候使用SQL语句那么肯定会特别复杂,稍有不慎就有可能会出错,因此使用LitePal来自动建立表关联又是一个非常不错的选择,我们不需要关心什么外键,什么中间表等实现的细节,只需要在实体类中声明好他们之间的引用关系即可。
 

你可能感兴趣的:(Android)