我們在用SQLite查數據的時候,經常會用到Cursor這個游標,我們希望能將游標指向的數據直接綁定到ListView中,這樣就免去了將游標數據取出然后轉換到SimpleAdapter中的麻煩。今天我們來演示下這個適配器如何使用。
思路:通過傳統的方法執行查詢操作,返回一個Cursor,將這個游標放入到SimpleCursorAapter的構造函數中即可,最后setAdapter
MainActivity.java
package com.kale.cursoradapter; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class MainActivity extends Activity { DatabaseManager dbManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到一個數據層操作對象 dbManager = new DatabaseManager(this); //因為在數據庫建立的時候我們已經建立一個表了,所以這里就可以直接插入數據了 String insertSql = "insert into test_table (name,age) values('kale',20)"; //用循環的方式來插入20條數據 for (int i = 0; i < 20; i++) { dbManager.executeSql(insertSql); }
// 這個游標查詢到的數據中必須有一個列名為_id否則會報錯,所以寫sql語句的時候必須要查到_id。顯不顯示這個id到無所謂 String sql = "select _id,name,age from test_table";
//得到一個Cursor,這個將要放入適配器中 Cursor cursor = dbManager.executeSql(sql, null); // 最后一個參數flags是一個標識,標識當數據改變調用onContentChanged()的時候,是 // 否通知ContentProvider數據的改變,如果無需監聽ContentProvider的改變,則可以傳0。 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, new String[] { "name", "age" }, new int[] { R.id.name, R.id.age }, 0); ListView listView = (ListView) findViewById(R.id.listView); listView.setAdapter(adapter); } }
注意:這里查詢到的數據中必須有一列是_id,否則會報錯。所以在建表的時候就應該建立這一列。
后面兩個類基本就是直接從我之前的文章中copy過來的,方便以后使用。
數據庫對象類——DatabaseManager
package com.kale.cursoradapter; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; public class DatabaseManager{ DatabaseHelper mDbHelper = null; //操作數據庫的實例 static SQLiteDatabase mDb = null; Context mContext = null; public DatabaseManager(Context context) { mContext = context; mDbHelper = DatabaseHelper.getInstance(mContext); mDb= mDbHelper.getReadableDatabase(); } /** * 建立表 * SQLite內部只支持NULL,INTEGER,REAL(浮點),TEXT(文本),BLOB(大二進制)5種數據類型 * 建立表成功了,返回true */ public boolean executeSql(String sql){ try { mDb.execSQL(sql); return true; } catch(SQLiteException e){ return false; } } public Cursor executeSql(String sql,String[]args){ try { return mDb.rawQuery(sql, args); } catch(SQLiteException e){ e.printStackTrace(); } return null; } /** * 關閉連接 */ public void closeDBhelper() { if (mDbHelper != null) { mDbHelper.close(); } } }
DatabaseHelper
package com.kale.cursoradapter; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper{ private static DatabaseHelper mInstance = null; //數據庫名字 public static final String DATABASE_NAME = "SQLite_db"; //版本號 private static final int DATABASE_VERSION = 1; //建立默認表的語句,必須有_id這個列 private static final String CREAT_TABLE_TABLE_SQL = "create table test_table(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,age INTEGER);"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public DatabaseHelper(Context context, String name, int version) { super(context, name, null, version); } public static synchronized DatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new DatabaseHelper(context); } return mInstance; } /* * 初次使用時創建數據庫表 */ @Override public void onCreate(SQLiteDatabase db) { //通過sql語句建立默認表 db.execSQL(CREAT_TABLE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /**可以拿到當前數據庫的版本信息 與之前數據庫的版本信息 如果不同,那么就更新數據庫**/ } //刪除數據庫 public boolean deleteDatabase(Context context , String databaseName) { return context.deleteDatabase(databaseName); } }
源碼下載:http://download.csdn.net/detail/shark0017/8026895