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;@Overrideprotected 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