查詢資料庫均會把查詢的結果封裝在一個Cursor的子類對象中返回。Cursor就像是位於結果集之上的一個遊標,可以對結果集進行向前、向後或隨機的訪問。而Cursor本身是一個介面類,提供了對結果集訪問的一些抽象方法,根據功能的不同在其子類有著不同的實現。要控制查詢時返回的Cursor類型,可以自訂一個繼承自CursorFactory類通過實現其newCursor()方法來返回需要的Cursor子類對象,但在CursorFactory傳入null的預設情況下,查詢操作會返回一個指向第一行資料之前的SQLiteCursor的對象。
對Cursor中常用的一些方法的介紹。
有關Cursor的常用方法
在實際的應用編寫過程中,更多是通過適配器(Adapter)來將Cursor與適配器控制項聯絡起來。Android為Cursor提供了一個抽象類別CursorAdapter,可以方便實現Cursor與適配器的串連。只需要建立一個繼承自CursorAdapter的類,實現其bindView()和newView()兩個抽象方法,或根據需要重新實現其他方法就可以用此類來構造一個可適配Cursor的適配器。下面是關於bindView()和newView()兩個抽象方法需要實現的內容。
- public void bindView(View view, Context context, Cursor cursor)
重用一個已有的view,使其顯示當前cursor所指向的資料。
- public View newView(Context context, Cursor cursor, ViewGroup parent)
為cursor所指向的資料建立一個View對象,並顯示其資料。
另外還需要注意的是,傳入到CursorAdapter中的Cursor結果集必須包含有列名為_id的列,否則CursorAdapter將不會起作用。
Adapter 的作用是什麼,想必大家看了Android SDK中的原文就一目瞭然:
An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.
已經介紹到了幾種Android已經實現好了的適配器,其中SimpleCursorAdapter就是為Cursor對象專門實現的一種方便使用的適配器類,下面是對其構造方法傳入參數的介紹:
public SimpleCursorAdapter (Context contex, int layout, Cursor c, String[]from, int[] to)
- context,當前程式的內容物件。
- layout,用來描述如何顯示在適配器控制項上的布局檔案的R類引用。
- from,由需要顯示出來的列名組成的字串數組。
- to,由layout所指定的布局檔案中子控制項的id所組成的整形數組,與from相對應。
綜合前面的說明,舉個具體例子如下:
變數以便在程式中引用:
TextView display;
Spinner s;
…
填充Spinner控制項的代碼:
s = (Spinner)findViewById(R.id.spinner);
display = (TextView)findViewById(R.id.display);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item,
c,
new String[] { MyHelper.COUNTRY},
new int[] {android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s.setAdapter(adapter);
s.setOnItemSelectedListener(new OnItemSelectedListener()
{
public void onItemSelected(AdapterView<?> adapter,View v,int pos, long id)
{
c.moveToPosition(pos);
display.setText(c.getString(codeIndex));
}
public void onNothingSelected(AdapterView<?> arg0) {}
});
首先通過id分別獲得TextView和Spinner對象的引用,然後使用之前查詢返回的Cursor和Android 內建的Spinner子控制項的布局構造一個SimpleCursorAdapter,再調用setDrop-DownViewResource()方法來設定點開Spinner後顯示子控制項的布局,最後設定Spinner的適配器為adapter並對其子控制項被選取的事件設定一個監聽器。需要注意的是Spinner不支援設定點擊事件的監聽器(OnClickListener),強行設定的話會拋出異常。最後程式啟動並執行結果,如所示: