简介:开源库-LitePal是一款开源的数据库的开源的Android数据库框架,它采用对象关系映射(OPM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。
1)配置LitePal
目前大多数开源项目都会将版本提交到jcenter上,我们只需要在app/build.gradle文件,在dependencies闭包中添加如下内容
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "com.example.a14468.litepal"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'org.litepal.android:core:1.3.2'
//注意:如果添加这条代码出错,那可能是版本问题,直接复制我这串代码上去替换就可以了!
}
接下来需要配置litepal.xml文件
,右击app/src/main 目录->New->Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件中的内容,如下所示
<?xml version="1.0" encoding="UTF-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
</list>
</litepal>
代码分析:<dnname>标签用于指定数据库名,<version>标签用于指定数据库版本号,<list>标签用于指定所有映射模型,稍后会用到。注意名字别打错,打错的话程序会崩溃!
最后在配置一下LitePalApplication,修改AndroidManifest.xml中的代码,如下所示
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a14468.litepal">
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这里将项目的application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能都可以正常工作。
至此LitePal配置工作全部完成!
2)创建和升级数据库
先回想一下我们之前创建的数据库是通过一个类继承至SQLiteOpenHelper,然后再OnCreate()方法中编写建表语句来实现,使用LitePal就不需要这么麻烦,我们直接用它提供的方法既可以简单的实现。
首先我们将activity_main里面的代码修改一下 功能:添加四个 Buton按钮(CRUD增删改查),跟DatabaseTest项目里的activity_main一样的。
接着我们补充一点理论知识,LitePal采取的是对象关系映射(ORM)模式,大概意思是我们使用的语言是面向对象的语言,而使用的数据库这是关系型数据库,将面向对象的语言和面向关系的数据库建立一种映射关系,这就是对象关系映射。并且它赋予了我们一个很强大的功能,就是可以用面向对象的思维操作数据库,而不用再和SQL语句打交道了。在使用SQL创建表的时候需要先分析表中应该包含哪些列,然后编写出一条建表语句,但是使用LitePal,我们可以使用面向对象的思维来实现同样的功能了!废话不多说,继续开始编写代码:
定义一个Book类 功能:在Book类中定义 id、author、price、name这几个字段,并生成相应的getter和setter方法。
public class Book{
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;
}
}
代码分析:在这里,Book类就对应了Book表,每一个字段分别对应表中每一列,这就是对象关系映射最直观的体验。
接下来我们还需要将Book类添加到映射模型列表当中,修改litepal.xml中的代码,如下所示
<?xml version="1.0" encoding="UTF-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
<mapping class="com.example.a14468.litepal.Book"></mapping>
</list>
</litepal>
代码分析:这里使用<mapping>标签来声明我们要配置的映射模型类,注意要使用完整的类名。不管有多少的模型类需要映射,都是用同样的方法配置在<list>标签下即可。
到这里就已经把所有工作都做完了,现在只要任意一次数据库的操作,BookStore.db数据库应该就会自动创建出来。修改MainActivity的代码 功能:通过点击创建按钮 创建数据库
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();//创建数据库
}
});
}
}
代码分析:调用Connector.getDatabase()方法就是一次最简单的数据库的操作,点击一下按扭就能对数据库创建情况。
到现在是不是觉得对数据库操作很简单!接下来会更简单!
但是这个代码有一个问题,当升级数据库的时候我们需要把之前的表drop掉,然后重新创建才行。不过LitePal已经提供了这个功能!举个例子,我们想要向Book表中添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段即可如下所示:
public String press;
........
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
}
}
于此同时,我们再添加一个表Category表,那么只需要新建一个Category类就可以了,代码如下所示
public class Category {
private int id;
private String categoryName;
private int categoryCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(int categoryCode) {
this.categoryCode = categoryCode;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
该完了想改的东西,只需要记得将版本号加1就行。当然由于这里还添加了一个模型类,因此也需要将他映射到模型列表中。修改litepal.xml中的代码,如下所示
<?xml version="1.0" encoding="UTF-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="2"></version>
<list>
<mapping class="com.example.a14468.litepal.Book"></mapping>
<mapping class="com.example.a14468.litepal.Category"></mapping>
</list>
</litepal>
3)使用LitePal添加数据
我们先回顾一下之前添加数据的方法:首先创建出一个ContentValues对象,然后将所要添加的数据put到这个ContentValues对象当中,最后调用SQLiteDatabase的insert()方法将数据添加到数据库表当中。
我们使用LitePal来添加数据的方法:创建出模型实例,再将所有要存储的数据设置好,最后调用一下save()方法就可以了。
具体步骤:
首先LitePal进行表管理操作的时候不需要模型类有任何继承结构,但是进行CRUD操作是就不行了,必须继承自DataSupport类才行,因此我们需要把继承结构给加上。修改Book类的代码,如下所示:
public class Book extends DataSupport {
.............................()中间省略
}
然后向Book表中南添加数据,修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();
}
});
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setName("Tony Park");
book.setAuthor("Tony");
book.setPages(454);
book.setPrice(38.38);
book.setPress("Unknow");
book.save();
}
});
代码分析:添加数据按钮的点击事件里面。首先是创建出了一个Book实例,然后调用Book类中的各种set方法对数据进行设置,最后在调用book.save()方法就能完成数据添加操作了。这个save()方法就是从DataSupport类中继承而来。除了save()方法以外,DataSupport类还提供了丰富的CRUD方法,操作如下所示
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connector.getDatabase();
}
});
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setName("Tony Park");
book.setAuthor("Tony");
book.setPages(454);
book.setPrice(38.38);
book.setPress("Unknow");
book.save();
}
});
Button updateBata = (Button) findViewById(R.id.update_data);
updateBata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//更新数据
Book book = new Book();
//使用setPrice()和setPress()方法来设置更新数据
book.setPrice(14.95);
book.setPress("XZP");
//调用updateAll方法执行更新操作,可以指定一个约束项
book.updateAll("name = ? and author = ?","Tony Park","Tony");
}
});
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//删除操作
DataSupport.deleteAll(Book.class,"price < ?","15");
}
});
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//查询数据操作 findAll()方法返回值是一个Book类型的List集合
List<Book> books = DataSupport.findAll(Book.class);
for (Book book: books){
Log.d("MainActivity","book name is "+ book.getName());
Log.d("MainActivity","book author is "+ book.getAuthor());
Log.d("MainActivity","book pages is "+ book.getPages());
Log.d("MainActivity","book price is "+ book.getPrice());
Log.d("MainActivity","book press is "+ book.getPress());
}
}
});
}
}
另外查询语句也有很多的方法:
//1、查询Book表中第一条数据
Book firstBook = DataSupport.findFirst(Book.class);
//2、查询Book表中最后一条数据
Book lastBook = DataSupport.findLast(Book.class);
//3、select()方法用于指定哪几列的数据,对应了SQL当中的select关键字
List<Book> books1 = DataSupport.select("name","author").find(Book.class);
//4、Where()方法用于指定查询的约束条件,对应了当中的where关键字。比如只查页数大于400的数据,就可以这样写
List<Book> books2 = DataSupport.where("pages > ?","400").find(Book.class);
//5、order()方法用于指定排序哪几列数据,对应了SQL当中的order by关键字。比如将查询结果按照书价从高到低排序,就可以这样写
List<Book> books3 = DataSupport.order("price desc").find(Book.class);//其中desc表示降序排列,asc表示升序排列,不写默认升序排列
//6、limit()方法用于指定查询结果的数量,比如只查询前面前3条数据就可以这样写
List<Book> books4 = DataSupport.limit(3).find(Book.class);
//7、offset()方法用于指定查询结果的偏移量,比如查询表中第二条、第三条、第四条数据就可以这样写:
List<Book> books5 = DataSupport.limit(3).offset(1).find(Book.class);//由于limit(3)查询到的是前三条的数据,这里我们再加上offset(1)进行一个位置的偏移,就能实现查询的第二条、第三条、第四条数据的功能了。limit()和offset()方法共同对应了SQL当中的limit关键字
//8、对这5个方法进行任意的连缀组合,来完成一个比较复杂的查询操作:
List<Book> books6 = DataSupport.select("name","author","pages")
.where("pages > ?","400")
.order("pages")
.limit(0)
.offset(10)
.find(Book.class);// 这段代码表示,查询Book表中第11~20条满足页数大于400这个条件的name、author和pages这3列数据,并将查询结果按照页数升降排序
//9、使用原生的SQL来进行查询:
Cursor c =DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","200");
//调用DataSupport.findBySQL()方法来进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值。注意findById()方法返回的是一个Cursor对象,接下来你还需要通过之前所学老方式将数据一一取出才行