Android数据库框架LitePal的使用

前言

LitePal是一款开源的Android数据库框https://github.com/LitePalFramework/LitePa,它采用了对象关系映射(ORM)的模型,把对数据库的操作转换为对对象的操作。
开发者为郭霖。

参考文章http://www.jianshu.com/p/557682e0a9f0
郭霖CSDN

使用准备

导入

compile 'org.litepal.android:core:1.5.1'

导入配置文件

新建assets文件夹,放入新建的litepal.xml文件



    
    

    
    

    
    
    

    


用于设定数据库的名字,用于设定数据库的版本号,用于设定所有的映射模型,我们稍后就会用到。

配置LitePalApplication

简单的配置就是

  
      
    ...  
      
  

开始使用

如何使用面向对象的思想实现简单的操作 建表、增删改查

建表

类Datas 对应的就是表,数据类型自动映射到数据库数据类型
int、short、long、float、double、boolean、String和Date

public class Datas{  
    //可以不写自动生成  
    private int id;  

    private String title;  
      
    private String content;  
      
    private Date publishDate;  
      
    private int commentCount;  
      
    // 自动生成get、set方法  
    ...  
}  

导入到litepal.xml中完成建表过程。


        

注意
只有private修饰的字段才会被映射到数据库表中,即如果有某一个字段不想映射的话,就设置为public、protected或者default修饰符就可以了。

创建表SQLiteDatabase db = Connector.getDatabase();

升级数据库

同样的新建一个Conment的实体类,然后引入到litepal.xml中。关键一点就是要更改版本号,把数据库的版本号增加一。

同样的无论任何对数据库的结构更改都需要进行版本号的更改。

比如增加行,就是数据库对应实体类的参数增加并且版本号增加。
另外支持删除一列(android本身不支持,但是框架做到了类似的功能)。

基本操作

进行CRUD操作的基础就是表模型类继承DataSupport类

public class Datas extends DataSupport{


    private String title;

    private String content;

    private Date publishDate;

    private int commentCount;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getPublishDate() {
        return publishDate;
    }

    public void setPublishDate(Date publishDate) {
        this.publishDate = publishDate;
    }

    public int getCommentCount() {
        return commentCount;
    }

    public void setCommentCount(int commentCount) {
        this.commentCount = commentCount;
    }
}

插入

Datas mDatas = new Datas();
                mDatas.setTitle("测试数据");

                if (mDatas.save()) {
                    Snackbar.make(mCoordinatorLayout, "存储成功!", Snackbar.LENGTH_SHORT).show();
                } else {
                    Snackbar.make(mCoordinatorLayout, "存储失败!", Snackbar.LENGTH_SHORT).show();
                }

修改

如果想把DEST表中id为4的destId改为"1",可以这样写:

ContentValues values = new ContentValues();  
values.put("destId", "1");  
DataSupport.update(DEST.class, values, 4);  

//或者用下面这种方法

DEST updateNews = new DEST();  
updateNews.setDestId("1");  
updateNews.update(4);

如果想把DEST表中所有destId为"1"的改为"2"可以这样写:

ContentValues values = new ContentValues();  
values.put("destId", "2");  
DataSupport.updateAll(DEST.class, values, "destId = ?", "1");  

//或者用下面这种方法

DEST updateNews = new DEST();  
updateNews.setdestId("2");  
updateNews.updateAll("destId = ?", "1");

删除

比如说我们想删除DEST表中id为2的记录,就可以这样写:

DataSupport.delete(News.class, 2);

想把DEST表中destId为“1”的所有数据删除,就可以这样写:

DataSupport.deleteAll(DEST.class, "destId = ? ", "1");

如果我们想把DEST表中所有的数据全部删除掉,就可以这样写:

DataSupport.deleteAll(DEST.class);

查询

查询DEST表中id为1的这条记录,使用LitePal就可以这样写:

DEST mDest = DataSupport.find(DEST.class, 1);

想要获取DEST表中的第一条数据,只需要这样写:

DEST firstDest = DataSupport.findFirst(DEST.class);

想要获取News表中的最后一条数据,只需要这样写:

DEST lastDest = DataSupport.findLast(DEST.class);

想把DEST表中id为1、3、5、7的数据都查出来,只需要这样写:

List mDestList = DataSupport.findAll(DEST.class, 1, 3, 5, 7);

查询所有数据,只需要这样写:

List mDestList = DataSupport.findAll(DEST.class);

想查询DEST表中所有父类id为"1"的数据,就可以这样写:

List mDestList = DataSupport.where("parentId = ?", "1").find(DEST.class);

许你并不需要那么多的数据,而是只要cnName和enName这两列数据。那么也很简单,我们只要再增加一个连缀就行了,如下所示:

List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").find(DEST.class);

也许你还要数据按照添加的时间倒序排列,那么可以这样:

List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").find(DEST.class);

数据太多了,其实你只要前10行就行了,那么可以这样:

List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).find(DEST.class);

如果我们想进行分页展示,那么翻页了,怎么办?可以添加一个偏移量就好了,这样:

List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).offset(10).find(DEST.class);

内置的聚合函数

count()
如果想统计行数,那么就可以调用count()即可:

int result = DataSupport.count(DEST.class);

如果想统计parentId为"1"的数据的行数,那么可以这样:

int result = DataSupport.where("parentId = ?", "1").count(DEST.class);

sum()
如果想统计一下DEST表中,所有updateTime的和(虽然毫无用处....),那么可以这样:

long result = DataSupport.sum(DEST.class, "updateTime", long.class);

注意
第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。
sum()方法只能对具有运算能力的列进行求合,比如说整型列或者浮点型列,如果你传入一个字符串类型的列去求合,肯定是得不到任何结果的,这时只会返回一个0作为结果。

剩下的聚合函数方法大同小异了:
average()
max()
min()

表关联

三种对应关系一对一,一对多,多对多。
口诀就是

即一对一关联的实现方式是用外键,多对一关联的实现方式也是用外键,多对多关联的实现方式是用中间表。

记下了这个口诀,在很多数据库设计的时候,你都可以发挥得更加游刃有余。

而使用LitePal只需要在对象中声明好它们相互之间的引用关系,LitePal就会自动在数据库表之间建立好相应的关联关系了。

下面看如何声明引用关系:

一对一:

首先新建两个类News和Introduction,具体略。
然后在

public class News {  
    ...  
    private Introduction introduction;  
      
    // 自动生成get、set方法  
}  

这一行就能表明private Introduction introduction; 这两个表是一对一关系的。

一对多:

Comment和News是一对多的关系。

public class News {  
    ...  
    private Introduction introduction;  //一对一
      
    private List commentList = new ArrayList();  //一对多
      
    // 自动生成get、set方法  
}  

多对多:

News中可以包含多个Category

public class News {  
    ...  
    private Introduction introduction;  
      
    private List commentList = new ArrayList();  
      
    private List categoryList = new ArrayList();  
      
    // 自动生成get、set方法  
}  

而Category中也可以包含多个News,因此Category类也应该使用相同的

public class Category {  
    ...  
    private List newsList = new ArrayList();  
      
    // 自动生成get、set方法  
}  

修改后,添加版本号测试。就可以看到

一对一关系中,自动添加了外键,new_id

同样的comment表中也有一个news_id的列,那么comment表和news表之间的多对一关系也已经建立好了

category_news是中间表,一列是news_id,一列是category_id,分别对应着两张表的外键,多对多关系也建立了。


以上是使用说明。

你可能感兴趣的:(Android数据库框架LitePal的使用)