android: SQLite查詢數據


掌握了查詢數據的方法之后,你也就將數據庫的 CRUD 操 作全部學完了。不過千萬不要因此而放松,因為查詢數據也是在 CRUD 中最復雜的一種 操作。

我們都知道 SQL 的全稱是 Structured Query Language,翻譯成中文就是結構化查詢語言。 它的大部功能都是體現在“查”這個字上的,而“增刪改”只是其中的一小部分功能。由於 SQL 查詢涉及的內容實在是太多了,因此在這里我不准備對它展開來講解,而是只會介紹 Android 上的查詢功能。如果你對 SQL 語言非常感興趣,可以找一本專門介紹 SQL 的書進 行學習。

相信你已經猜到了,SQLiteDatabase 中還提供了一個 query()方法用於對數據進行查詢。 這個方法的參數非常復雜,最短的一個方法重載也需要傳入七個參數。那我們就先來看一下 這七個參數各自的含義吧,第一個參數不用說,當然還是表名,表示我們希望從哪張表中查 詢數據。第二個參數用於指定去查詢哪幾列,如果不指定則默認查詢所有列。第三、第四個 參數用於去約束查詢某一行或某幾行的數據,不指定則默認是查詢所有行的數據。第五個參 數用於指定需要去 group by 的列,不指定則表示不對查詢結果進行 group by 操作。第六個參 數用於對 group by 之后的數據進行進一步的過濾,不指定則表示不進行過濾。第七個參數用 於指定查詢結果的排序方式,不指定則表示使用默認的排序方式。更多詳細的內容可以參考 下表。其他幾個 query()方法的重載其實也大同小異,你可以自己去研究一下,這里就不再 進行介紹了。

 

 

 

query()方法參數

對應 SQL 部分

描述

table

from table_name

指定查詢的表名

columns

select column1, column2

指定查詢的列名

selection

where column = value

指定 where 的約束條件

selectionArgs

-

為 where 中的占位符提供具體的值

groupBy

group by column

指定需要 group by 的列

having

having column = value

對 group by 后的結果進一步約束

orderBy

order by column1, column2

指定查詢結果的排序方式

 

 

雖然 query()方法的參數非常多,但是不要對它產生畏懼,因為我們不必為每條查詢語

句都指定上所有的參數,多數情況下只需要傳入少數幾個參數就可以完成查詢操作了。調用

query()方法后會返回一個 Cursor 對象,查詢到的所有數據都將從這個對象中取出。 下面還是讓我們通過例子的方式來體驗一下查詢數據的具體用法,修改 activity_main.xml

中的代碼,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" >

 

……

 

 

<Button android:id="@+id/query_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Query data"/>

</LinearLayout>

這個已經沒什么好說的了,添加了一個按鈕用於查詢數據。然后修改 MainActivity 中的 代碼,如下所示:

 

public class MainActivity extends Activity {

 

private MyDatabaseHelper dbHelper;

 

@Override

 

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);

……

Button queryButton = (Button) findViewById(R.id.query_data);

queryButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

// 查詢Book表中所有的數據

Cursor cursor = db.query("Book", null, null, null, null, null, null);

if (cursor.moveToFirst()) {

do {

// 遍歷Cursor對象,取出數據並打印

String name = cursor.getString(cursor. getColumnIndex("name"));

String author = cursor.getString(cursor.

getColumnIndex("author"));

int pages = cursor.getInt(cursor.getColumnIndex("pages"));

 

double price = cursor.getDouble(cursor.

 

getColumnIndex("price"));

Log.d("MainActivity", "book name is " + name); Log.d("MainActivity", "book author is " + author); Log.d("MainActivity", "book pages is " + pages); Log.d("MainActivity", "book price is " + price);

}

while (cursor.moveToNext());

 

 }});}


}

cursor.close();

 

 

}

可以看到,我們首先在查詢按鈕的點擊事件里面調用了 SQLiteDatabase 的 query()方法 去查詢數據。這里的 query()方法非常簡單,只是使用了第一個參數指明去查詢 Book 表,后 面的參數全部為 null。這就表示希望查詢這張表中的所有數據,雖然這張表中目前只剩下一 條數據了。查詢完之后就得到了一個 Cursor 對象,接着我們調用它的 moveToFirst()方法將數據的指針移動到第一行的位置,然后進入了一個循環當中,去遍歷查詢到的每一行數據。在這個循環中可以通過 Cursor 的 getColumnIndex()方法獲取到某一列在表中對應的位置索引, 然后將這個索引傳入到相應的取值方法中,就可以得到從數據庫中讀取到的數據了。接着我 們使用 Log 的方式將取出的數據打印出來,借此來檢查一下讀取工作有沒有成功完成。最后 別忘了調用 close()方法來關閉 Cursor。

好了,現在再次重新運行程序,界面如圖 6.27 所示。

圖   6.27

 

點擊一下 Query data 按鈕后,查看 LogCat 的打印內容,結果如圖 6.28 所示。

 

圖   6.28

 

可以看到,這里已經將 Book 表中唯一的一條數據成功地讀取出來了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM