LitePal简介
LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表、増删改查的操作。并且LitePal很“轻”,jar包大小不到100k,而且近乎零配置。
框架地址:https://github.com/LitePalFramework/LitePal
配置LitePal
如果要使用到LitePal框架,首先就是要添加依赖了,打开app目录中的的build.gradle,然后在dependencies闭包中添加:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.litepal.android:java:3.0.0' //添加依赖
}
接着就是需要配置litepal.xml文件了,我们右键点击main—New—Direction,创建一个assets目录,然后在该目录下新建一个litepal.xml的文件,然后修改该文件中的内容:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
</list>
</litepal>
这里面的属性来具体介绍一下,首先是<dbname>,它是指我们要创建的数据库的名字;<version>则是指我们数据库的版本号;<list>则是我们要指定的映射模型。
最后就是在AndroidManifest.xml中的<application>中配置一下LitaPalApplication了:
<application
android:name="org.litepal.LitePalApplication"
......
到这里配置就结束了,下面我们就来看一下它的具体用法吧!
使用LitePal创建和升级数据库
1.创建数据库
因为LitePal采用了对象关系映射(ORM)的模式,因此简单来说就是可以让我们按照面向对象编程的思维来完成数据库的操作。所以我们就直接先创建一个Book类,并在其中添加一些有关书籍的信息:
package com.example.yzbkaka.litepaltest;
public class Book {
int id;
String bookName;
String author;
double price;
int pages;
public int getId(){
return id;
}
public String getBookName(){
return bookName;
}
public String getAuthor(){
return author;
}
public double getPrice(){
return price;
}
public int getPages(){
return pages;
}
public void setId(int id){
this.id = id;
}
public void setBookName(String bookName){
this.bookName = bookName;
}
public void setAuthor(String author){
this.author = author;
}
public void setPrice(double price){
this.price = price;
}
public void setPages(int pages){
this.pages = pages;
}
}
接着我们来将Book类添加到litepal.xml当中:
<list>
<mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
</list>
我们在<list>标签中将我们的Book类的完整路径给添加进去就可以了。
最后我们来修改主代码:
package com.example.yzbkaka.litepaltest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import org.litepal.LitePal;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button create = (Button)findViewById(R.id.create);
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LitePal.getDatabase(); //创建数据库
}
});
}
}
我们先在布局中添加了一个按钮,然后为该按钮添加相应的点击事件,我们这里是点击按钮之后会创建出我们的“BookStore.dp”数据库。这里我们使用的是对LitePal使用getDatabase()方法来进行创建的。
之后点击按钮,即可创建数据库成功。同样我们也可以使用adb shell来进行查看。
2.升级数据库
使用LitePal升级数据库也是很简单的,我们需要在我们创建的类中添加我们想要部分,然后在litepal.xml中将版本号加1即可。
......
int year;
public int getYear(){
return year;
}
public void setYear(int year){
this.year = year;
}
......
我们在Book类中添加了一个year常量。接着我们再来修改版本号:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="2"></version>
<list>
<mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
</list>
</litepal>
我们在这里将版本号增加了1,之后我们再次运行程序,点击按钮便会发现我们的“BookStore”中已经有了year这一项了。
LitePal的CRUD操作
LitePal中进行CRUD操作的前提是要让我们的表类继承自LitePalSupport,所以我们在开始先修改我们的Book类代码:
import org.litepal.crud.LitePalSupport;
public class Book extends LitePalSupport {
int id;
String bookName;
String author;
double price;
int pages;
int year;
public Book(String errorMessage) {
super(errorMessage);
}
......
接着在布局文件中再添加四个按钮来分别表示之后要进行的CRUD操作。
......
<Button
android:id="@+id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"/>
<Button
android:id="@+id/update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新数据"/>
<Button
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"/>
<Button
android:id="@+id/query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"/>
......
下面我们就来对我们的数据库进行操作吧!
1.添加数据
添加数据主要是使用Book类继承而来的save()方法。我们直接修改主代码:
......
Button add = (Button)findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book1 = new Book();
book1.setBookName("the book 1");
book1.setAuthor("author 1");
book1.setPages(200);
book1.setPrice(16.8);
book1.setYear(2016);
book1.save();
Book book2 = new Book();
book2.setBookName("the book 2");
book2.setAuthor("author 2");
book2.setPages(180);
book2.setPrice(10.8);
book2.setYear(2017);
book2.save();
}
});
......
我们在这里是创建了两行数据:book1和book2。我们创建的方法就是按照面向对象的思维来进行创建的,即构造相应的对象然后调用其内部的方法。最后我们就对每一个对象使用save()方法即可添加数据成功。
2.更新数据
更新数据同样使用的是继承而来的updateAll()方法来进行。我们修改主代码:
......
Button update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setPrice(18.8);
book.setYear(2018);
book.updateAll("bookName = ?","the book 1");
}
});
......
我们直接看到updateAll()方法中的参数,这里使用的参数和sql语句中的很像,同样也是在前面使用占位符?,然后在后面进行具体的限制。这里我们更新数据的具体含义是将bookName为the book 1的书的price改为18.8,year改为2018。
在更新数据时有一个地方是需要我们特别注意的,就是当我们想要把表中的某一列更新为该类型的默认值时,是不可以使用上面的set...()方法的。例如我们想要把year(为int型)改为0,则我们不能使用book.setYear(0);
,因为int类型的数据的默认值就是0。如果我们想要将数据更新为默认值,我们可以使用setToDefault()方法,例如我们想要把year改成默认值:
Book book = new Book();
book.setToDefault("year");
book.updateAll("bookName = ?","the book 1");
我们直接在setToDefault()方法中传入我们想要修改的列名即可。
3.删除数据
删除数据需要我们使用LitePal中的静态方法deleteAll()方法进行操作。我们修改主代码:
......
Button delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LitePal.deleteAll(Book.class,"price < ?","190");
}
});
......
在deleteAll()方法中我们第一个参数就是要指定是哪一张表。而后面的参数就是我们很熟悉的约束条件了。这里的含义是将Book表中price小于190的数据全部删除。
4.查询数据
查询数据是使用LitePal中的findAll()方法来实现的。我们继续修改主代码:
......
Button query = (Button)findViewById(R.id.query);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<Book> books = LitePal.findAll(Book.class);
}
});
......
findAll()方法需要传入的参数就是我们指定要查询的表,而它在调用完之后会返回一个Book类型的List,这样我们就成功的将数据转移到我们的books列表中了,之后我们只需要调用get...()方法来取得数据即可。
除此以外,LitePal中还有许多具体的查询操作API:
-
findFirst()
我们只需要传入要查询的表作为参数,即可返回一个对象,该对象中有该表第一行的所有数据。 -
select()
用于查询哪几列的数据,距离来说:
List<Book> books = LitePal.select("bookName","author").find(Book.class);
这段代码的意思是指查询Book表中bookName和author这两列的数据。
-
where()
和sql语句中的where所表示的意思是相同的,主要是用来进行约束。
List<Book> books = LitePal.select("pages > ?","175").find(Book.class);
-
order()
用于指定结果的排列方式,一般传入desc(降序排列)或者asc(升序排列)。
List<Book> books = LitePal.order("price desc").find(Book.class);
当然还有更多的API,如果想要了解可以去LitePal的官方文档中查看。
网友评论