SimpleCursorAdapter和ListView的结合使用
我们在用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