LitePal – 一款开源的Android数据库框架。
它采用对象关系映射的模式(ORM),将开发中常用的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建表和增删改查的操作。
在项目中使用开源库:
大多数的开源项目都会将版本提交的jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以了。
LitePal项目地址:https://github.com/LitePalFramework/LitePal
一、配置LitePal
1、app/build.gradle文件中声明该开源库
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
testCompile 'junit:junit:4.12'
compile 'org.litepal.android:core:1.6.0'
}
只需添加这一行:compile ‘org.litepal.android:core:1.6.0’
其中org.litepal.android:core 这个是固定部分;1.6.0是版本号的意思。
2、配置litepal.xml文件
在app\src\main\目录下,新建assets目录,然后在assets目录中新建litepal.xml文件。
litepal.xml文件内容如下:
<litepal>
<dbname value="BookStore" />
<version value="2" />
<list>
<mapping class="com.sky.litepaltest.Book" />
<mapping class="com.sky.litepaltest.Watch" />
list>
litepal>
其中:
标签用于指定数据库名称;
标签用于指定数据库版本号;
标签用于指定所有的映射模型;
标签用于声明需要配置的映射模型类,这里一定要用完整的类名。
3、配置AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sky.litepaltest">
<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配置为 android:name=”org.litepal.LitePalApplication”,这样才能让LitePal的所有功能正常工作。
二、创建和升级数据库
1、新建一个类,定义字段,并生成相应的getter和setter方法。
这里定义的类即为数据库中的表。所以想要新增一个表,只需要新增一个类并添加到映射模型列表中就行了。
定义的字段即为表中的每一列。所以想要新增一列,只需要新增一个字段并生成相应的getter和setter方法就行了。
生成getter和setter方法的快捷键:先在类中定义好字段,然后按下Alt+Insert
2、将类添加到映射模型列表中,即litepal.xml文件中的标签
3、通过调用 Connector.getDatabase()方法就能够创建数据库了。
4、通过修改b标签的版本号,即可完成数据库的升级操作。
三、数据库的操作 – CRUD操作
想要进行CRUD操作,就必须让模型类继承DataSupport类才行,如下
public class Book extends DataSupport{
.......
}
1、添加数据
创建模型类的实例,然后调用实例的各种setter()方法去设置数据,最后调用实例的save()方法即可
private void addData() {
Book book = new Book();
book.setName("Android");
book.setAuthor("sky");
book.setPages(201);
book.setPrice(55.8);
book.save();
}
2、更新数据
更新的方式比较多,最简单的一种更新方式就是对已存储的对象重新设值,然后再调用save()方法即可。
private void updateData1() {
Book book = new Book();
book.setName("Android");
book.setAuthor("sky");
book.setPages(201);
book.setPrice(55.8);
book.save();
book.setPrice(25.8);
book.save();
}
方式二:使用updateAll()方法
private void updateData2() {
Book book = new Book();
book.setPrice(25.8);
book.updateAll("author=?", "demo");
}
updateData2()方法就所有author是demo的Price更新为25.8了。
updateAll()方法如果不指定条件语句的话,就表示更新所有数据。
private void updateData3() {
Book book = new Book();
book.setToDefault("price");
book.updateAll();
}
上述代码表示把所有的价格都更新为默认值0。
setToDefault()方法是把数据更新成默认值。
3、删除数据
主要有两种删除数据的方式:
第一种,是直接调用已存储对象的delete()方法。
private void deleteData1() {
Book book = new Book();
book.setPrice(25.8);
book.save();
book.delete();
}
另一种,是使用deleteAll()方法。
private void deleteData2() {
DataSupport.deleteAll(Book.class, "price < ?", "90");
}
上述代码表示把Book表中价格低于90的数据都删除。
updateAll()方法如果不指定条件语句的话,就表示删除表中的所有数据。
4、查询数据
查询数据有很多接口
查询表中所有数据 – findAll()方法。
List books = DataSupport.findAll(Book.class);
该方法返回一个类类型的List集合,这样就可遍历查询的数据了
查询表中第一条数据 – findFirst()方法。
Book book = DataSupport.findFirst(Book.class);
查询表中最后一条数据 – findLast()方法。
Book book = DataSupport.findLast(Book.class);
还可以通过连缀查询来定制更多的查询功能
select()方法,用于指定查询那几列的数据
如只查表中name和author这两列的数据:
List books = DataSupport.select(“name”,”author”).find(Book.class);
where()方法,用于指定查询的约束条件
如查询表中价格大于10的数据:
List books = DataSupport.where(“price>?”,”10”).find(Book.class);
order()方法,用于指定结果的排序方式
如查询结果按照价格高到低排序:
List books = DataSupport.order(“pricre desc”).find(Book.class);
desc表示降序排序;asc或者不写表示升序排序
limit()方法,用于指定查询结果的数量
如查表中的前3条数据:
List books = DataSupport.limit(3).find(Book.class);
offset()方法,用于指定查询结果的偏移量
如查表中的第2条、第3条、第4条数据:
List books = DataSupport.limit(3).offset(1).find(Book.class);
也还可以将上述的5个方法都组合起来查询。
List books = DataSupport.select(“name”,”author”)
.where(“price>?”,”10”)
.order(“pricre desc”)
.limit(3)
.offset(1)
.find(Book.class);
如果上述API都满足不了的话,还可以用原生的SQL来查询:
Cursor cursor = DateSupport.findBySQL(“select * from Book where pages > ? and price < ?”, “200”, “10”);
实例:
app\build.gradle文件
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
testCompile 'junit:junit:4.12'
compile 'org.litepal.android:core:1.6.0'
}
app\src\main\assets\litepal.xml文件
<litepal>
<dbname value="BookStore">dbname>
<version value="1">version>
<list>
<mapping class="com.sky.litepaldemo.Book">mapping>
list>
litepal>
app\src\main\AndroidManifest.xml文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sky.litepaldemo">
<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>
模型类Book.java
public class Book extends DataSupport {
private int id;
private String author;
private double price;
private int pages;
private String bookName;
public void setId(int id) {
this.id = id;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(double price) {
this.price = price;
}
public void setPages(int pages) {
this.pages = pages;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getPages() {
return pages;
}
public String getBookName() {
return bookName;
}
public double getPrice() {
return price;
}
public int getId() {
return id;
}
public String getAuthor() {
return author;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnCreateDatabase = (Button)findViewById(R.id.btnCreateDatabase);
Button btnAddData = (Button)findViewById(R.id.btnAddData);
Button btnUpdateData = (Button)findViewById(R.id.btnUpdateData);
Button btnDeleteData = (Button)findViewById(R.id.btnDeleteData);
Button btnQueryData = (Button)findViewById(R.id.btnQueryData);
btnQueryData.setOnClickListener(this);
btnDeleteData.setOnClickListener(this);
btnUpdateData.setOnClickListener(this);
btnAddData.setOnClickListener(this);
btnCreateDatabase.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnCreateDatabase:
Connector.getDatabase();
Toast.makeText(this, "Create Database", Toast.LENGTH_SHORT).show();
break;
case R.id.btnAddData:
addData();
Toast.makeText(this, "add data", Toast.LENGTH_SHORT).show();
break;
case R.id.btnUpdateData:
updateData();
Toast.makeText(this, "update data", Toast.LENGTH_SHORT).show();
break;
case R.id.btnDeleteData:
deleteData();
Toast.makeText(this, "delete data", Toast.LENGTH_SHORT).show();
break;
case R.id.btnQueryData:
queryData();
Toast.makeText(this, "query data", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
private void queryData() {
List bookList = DataSupport.findAll(Book.class);
for (Book book:bookList){
Log.d("MainActivity", "book name is:"+book.getBookName());
Log.d("MainActivity", "book author is:"+book.getAuthor());
Log.d("MainActivity", "book price is:"+book.getPrice());
Log.d("MainActivity", "book pages is:"+book.getPages());
Log.d("MainActivity", "------------------------------------------");
}
}
private void deleteData() {
DataSupport.deleteAll(Book.class, "price < ?", "30");
}
private void updateData() {
Book books = new Book();
books.setPrice(42.0);
books.updateAll("author=?", "sky");
}
private void addData() {
Book books = new Book();
books.setBookName("adb");
books.setAuthor("sky");
books.setPages(600);
books.setPrice(23.8);
books.save();
Book book2 = new Book();
book2.setBookName("adb");
book2.setAuthor("demo");
book2.setPages(800);
book2.setPrice(22.8);
book2.save();
}
}