在許多時候需要將資料庫表中的資料顯示在ListView、Gallery等組件中。雖然可以直接使用Adapter對象處理,但工作量很大。為此,Android SDK提供了一個專用於資料繫結的Adapter類:SimpleCursorAdapter。
SimpleCursorAdapter與SimpleAdapter用法相近。只是將List對象換成了Cursor對象。而且SimpleCursorAdapter類構造方法的第四個參數from表示Cursor對象中的欄位,而SimpleAdapter類構造方法的第四個參數from表示Map對象中的key。除此之外,這兩個Adapter類在使用方法完全相同。
下面是SimpleCursorAdapter類構造方法定義。
public SimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to);
下例中通過SimpleCursorAdapter類將資料庫表綁定在ListView上,也就是說,該ListView會顯示資料表的全部記錄。在綁定資料前,需要先編寫一個SQLiteOpenHelper類的子類,用於操作資料庫,代碼如下:
Java代碼
package com.li;
import java.util.Random;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBService extends SQLiteOpenHelper {
private final static int DATABASE_VERSION = 1;
private final static String DATABASE_NAME = "test.db";
public DBService(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建立表
String sql = "CREATE TABLE [t_test](" + "[_id]AUTOINC,"
+ "[name]VARCHAR2(20) NOT NULL CONFLICT FAIL,"
+ "CONSTRAINT[sqlite_autoindex_te_test_1]PRIMARY KEY([_id]))";
db.execSQL(sql);
//向test資料庫中插入20條記錄
Random random = new Random();
for ( int i = 0;i<20;i++)
{
String s = "";
for(int j=0;j<10;j++)
{
char c = (char)(97+random.nextInt(26));
s+=c;
}
db.execSQL("insert into t_test(name)values(?)",new Object[]{s});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
//執行查詢語句
public Cursor query(String sql,String[] args)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, args);
return cursor;
}
}
本例不需要對test.db進行升級,因此,只有在DBService類中的oncreate()方法中有建立資料庫表的代碼。DBService類建立了一個test.db資料庫檔案,並在該檔案中建立了t_test表。在該表中包含兩個欄位_id和name。其中_id是自增欄位,並且是主索引。
下面編寫MapsDemo類。MapsDemo類是ListActivity的子類。在該類中的oncreate()方法中建立了DBService對象,然後通過DBService類的query方法查詢出t_test表中的所有記錄,並返回Cursor對象。MapsDemo類的代碼如下:
Java代碼
package com.li;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
public class MapsDemo extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DBService dbService = new DBService(this);
//查詢資料
Cursor cursor = dbService.query("select * from t_test", null);
//綁定資料
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter (this,android.R.layout.simple_expandable_list_item_1,cursor,new String[]{"name"},new int[]{android.R.id.text1});
setListAdapter(simpleCursorAdapter);
}
}
SimpleCursorAdapter類構造方法的第四個參數表示返回Cursor對象中的欄位名,第五個參數表示要將該欄位的值賦給那個組件。該組件在第二個參數中指定的布局檔案中定義。
注意:在綁定資料時,Cursor對象返回的記錄集中必須包含一個叫"_id"的欄位,否則將無法完成資料繫結。也就是說SQL語句不能是select name from t_contacts.如果在資料表中沒有"_id"欄位,可以採用其他方法來處理。
讀到這裡可能有人要問:資料存到哪裡去了?系統在手機記憶體中的/data/data/<package name>/databases目錄中建立資料庫檔案。
作者“myxuee”