Android的数据库

LitePal

熟悉Android的人都知道Android自带了一个SQLite数据库Android也给了一些api来操作它,不过有一个更好用的API就是LitePal

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

LitePal的配置

配置LitePal很简单,打开LitePal找到下图的地方。

把下面代码复制到Android项目的app/build.gradle的dependencies{}里面即可。

1
compile 'org.litepal.android:core:1.4.1'

其中1.4.1代表版本号,想要最新的版本号去打开LitePal找即可。
然后点击Sync Now,即可成功引入Jar包。

接下来配置litepal.xml文件,在app/src/main目录下新建assets文件夹,在assets文件夹中新建litepal.xml文件输入以下内容

1
2
3
4
5
6
7
8
<!-- dbname value为数据库名,version value为版本号 <list>主要用来映射模型 -->
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore" />
<version value="1" />
<list>
</list>
</litepal>

为了方便LitePal获得Context对象最后还要修改AndroidManifest.xml,在< application>标签
中加入android:name=”org.litepal.LitePalApplication”

1
2
3
4
5
6
7
8
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>

当然也可以在直接用 LitePal.initialize(Context);方法传递Context以便LitePal能正常运行。

LitePal创建数据库和表的建立更新与删除

LitePal的建立表很简单,想要新建一个Book表就新建定义一个Book类

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//继承DataSupport是为了能够 crud(增删改查),本身创建数据库和表是可以不用继承也能创建成功的
public class Book extends DataSupport{
private int id;
private String author;
private double price;
private int pages;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

很明显这是一个javabean,在Book表里面定义了id,author,price,pages,name字段,并生成setter和getter方法。
接下来需要把Book类映射模型列表当中,修改litepal.xml

1
2
3
4
5
6
7
8
9
10
<!-- dbname value为数据库名,version value为版本号 <list>主要用来映射模型 -->
<!--<mapping>标签需要完整类名-->
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore" />
...
<list>
<mapping class="com.app.cczhr.litepaldemo.Book"></mapping>
</list>
</litepal>

最后只要任意进行一次数据库的操作,Bookstore.db即可自动创建完毕。这里我使用的是 Connector.getDatabase();方法。

1
Connector.getDatabase();

如果要新建多一个表只需要重复之前的动作即可,若要修改已生成的表字段只需要修改你要改的表的类,若要删除表就把相关代码删除。
做完所有的更改操作后最后在< litepal>标签下的 < version value=”1” />里面的版本号加1即可。

注意:id字段在LitePal为默认自增主键,类型只能为int。

LitePal添加数据

LitePal添加数据(初级)

LitePal添加数据(初级)很简单,用Book类的各种set方法对数据设置,最后使用save方法保存即可。

1
2
3
4
5
6
Book book=new Book();
book.setName("新华字典");
book.setAuthor("新华出版社");
book.setPages(666);
book.setPrice(16.66);
book.save();

LitePal添加数据(进阶)

看完剩下的,你就会进阶玩法了。

LitePal更新数据

LitePal更新数据,可以看到new了一个Book,然后直接set要修改的值,最后使用updateAll方法指定更新的条件,这里指定的是name =”新华字典” 同时 author =”新华出版社”的数据,若updateAll里面什么都不填则是修改全部的pages字段。

1
2
3
Book book=new Book();
book.setPages(233);
book.updateAll("name = ? and author = ?","新华字典","新华出版社");

注意,若你想把pages改为默认值0是不能直接book.setPages(0);的,
LitePal提供了改默认值的setToDefault方法,如以下代码。
1
2
3
Book book=new Book();
book.setToDefault("pages");//填入要修改的字段名
book.updateAll("name = ? and author = ?","新华字典","新华出版社");

LitePal删除数据

LitePal删除数据和更新数据差不多,这里表示删除book表里面price>15的数据。
若deleteAll不填条件则是删除book表全部的内容。

1
DataSupport.deleteAll(Book.class,"price > ?","15");

LitePal查询数据

返回全部结果

1
2
3
4
5
6
LIst<book> books=DataSupport.findAll(book.class);
for(Book book : books){
book.getName();
....
book.getPrice();
}

较复杂的查询操作

1
2
3
4
5
6
LIst<book> books=DataSupport.select("name","author","pages")//表示选取"name","author","pages"这三种数据
.where("pages>?","400")//表示其中”pages“要大于400
.order("pages desc")//表示按页数降序排列,去掉desc为降序
.limit(10)//表示查询数量
.offset(10)//表示偏移量,即从11条开始
.findAll(book.class);

LitePal使用原生的方法查询数据

LitePal同时也支持原生的查询数据

1
2
3
4
5
6
7
Cursor c=DataSupport.findBySQL("select name from book where pages >? and price < ?","50","100");
if(c.moveToFirst()){
do{
String name=c.getString(c.getColumnIndex("name"));
}while (c.moveToNext);
}
c.close();