前言
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,分别对应着两张表的外键,多对多关系也建立了。
以上是使用说明。