LitePal在查询API方面做了非常多的优化,基本上可以满足绝大多数场景的查询需求,并且代码也十分整洁。
例如我们需要查询表中的所有数据:
List<books> = DataSupport.findAll(Book.class);
没有冗长的参数列表,只需要调用一下findAll()方法,然后通过Book.class参数指定查询Book就可以了。另外,findAll()方法的返回值是一个Book类型的List集合。例如,在一个登录界面,有两个Edittext和一个Button,用来输入用户名和密码,然后点击按钮进行登录,我们只是把这两个字段建成一张表,用来存储用户的登录信息。代码如下:
package com.example.testappb;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import org.litepal.LitePal;
import org.litepal.crud.DataSupport;
import java.sql.BatchUpdateException;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button user;
private Button driver;
private EditText accountEdit;
private EditText passwordEdit;
private Button login;
private Button Register;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
.. ....
//获取输入框内对象实例
user = (Button)findViewById(R.id.button_user) ;
accountEdit =(EditText)findViewById(R.id.edittext_account);
passwordEdit = (EditText)findViewById(R.id.edittext_password);
//设置登录按钮透明度
login = (Button)findViewById(R.id.login);
login.getBackground().setAlpha(25);
login.setOnClickListener(new View.OnClickListener() {
@Override//
public void onClick(View view) {
String account= accountEdit.getText().toString();
String password = passwordEdit.getText().toString();
// Driveruser driveruser =new Driveruser();//首先创造了一个Driveruser的实例。
// driveruser.getDtel();//使用set方法对数据进行设置
// driveruser.getDpassword();
// driveruser.save();//使用save()保存。save方法来源于DataSupport中继承而来的
//登录匹配数据库
List<Driveruser> driveruers = DataSupport.findAll(Driveruser.class);
for(Driveruser driveruser:driveruers){//遍历List集合中的Driveruser对象,然后下面依次比较,如果输入的用户名和密码与数据库中的存储的用户名和密码相似则允许登录,并跳转到下一个活动
if((driveruser.getDtel().toString()).equals(account)&&(driveruser.getDpassword().toString()).equals(password)){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,FirstActivity.class);//登录成功,跳转到FirstActivity活动
startActivity(intent);//启动活动
finish();
}else//异常判断
{
Toast.makeText(MainActivity.this,"用户名或者密码无效,请重新输入",Toast.LENGTH_SHORT).show();
break;
}
}
});
.......
.......
}
}
除了findAll()方法,LitePal还提供了很多其他非常有用的查询API。比如我们想要
查询Book表中第一条数据,可以这样写:
Book firstBook = DataSupport.findFirst(Book.class);
查询Book表中的最后一条数据,可以这样写:
Book lastBook = DataSupport.findLast(Book.class);
还可以通过连缀查询来定制更多的查询功能。(与SQL对应)
- select()方法用于指定查询哪几列的数据,查询name和author这两列的数据,可以这样写:
List<Book> books = DataSupport.select("name","author").find(Book.class);
- where()方法用于指定查询的约束条件,比如只查询页数大于400的数据,可以这样写:
List<Book> books = DataSupport.where("pages > ?","400").find(Book.class);
- order()方法用于指定结果的排序方式,对应SQL中的order by 关键字。比如将查询结果按照书价从高到低排序,这样写:
List<Book> books = DataSupport.order("price desc").find(Book.class);
其中desc表示降序排列,asc或者不写表示升序排列。
- list()方法用于指定查询结果的数量,比如只查询表中的前3条数据,可以这样写:
List<Book> books = DataSupport.limit(3).find(Book.class);
offset()方法用于指定查询结果的偏移量,比如查询表中的第2条,第3条,第4条数据,就可以这样写:
List<Book> books = DataSupport.limit(3).offset(1).find(Book.calss).
limit()和offset()方法共同对应了SQL当中的limit关键字。
当然,我们还可以对这5个方法进行任意的连缀组合,来完成一个比较复杂的查询操作:
List<Book> books =
DataSupport.select("name","author","pages").where("pages>?","400").order("pages").limit(10).offset(10).find(Book.class)。
这段代码表示,查询Book表中第11——20条满足页数大于400这个条件的name,author和pages这三列数据,并将查询结果按照页数升序排列。但是,当有血特殊需求,上述的API都满足不了的时候,LitePal仍然支持使用原生的SQL来进行查询:
Cursor c= DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");
调用DataSupport.findBySQL()方法进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值。注意findBySQL()方法返回的是一个Cursor对象,接下来还需要通过之前的老方式将数据一一取出。所谓的老方式详见6.4.6节郭霖《第一行代码》第二版。P225