sqlite的使用在android中时很重要的一部分,很多时候需要将表中的数据显示在ListView控件中,一种方法是用BaseAdapter进行处理,另一种方法就是使用android SDK提供的一个专用于数据绑定的Adapter类:SimpleCursorAdapter。
SimpleCursorAdapter类构造方法如下:
public SimpleCursorAdapter(Context context, int layout, Cursor c, String [] from, int [] to)
这个例子是用SimpleCursorAdapter类将表中的数据显示在ListView上,在显示数据之前需要编写一个DBServer类,这个类是SQLiteOpenHelper的子类,用来进行数据库的基本操作,代码如下:
DBServer.java
package com.example.sqlite;
import java.util.Random;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
* @author 巨龙
*
* 2014-7-4
*/
public class DBServer extends SQLiteOpenHelper{
private final static int VERSION = 1;
private final static String DBNAME = "test.db";
/**
* @param context
* @param name
* @param factory
* @param version
*/
public DBServer(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public DBServer(Context context){
super(context,DBNAME,null,VERSION);
}
/* (non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
*/
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
//这里必须包含字段_id,不然后面会报错。
String sql = "CREATE TABLE TEST(_id integer PRIMARY KEY autoincrement,NAME varchar[10])";
arg0.execSQL(sql);
//生成随机的长度为5的字符串
Random rm = new Random();
for(int i = 0; i < 20 ; i++){
String s = "";
for(int j = 0; j < 5 ; j++){
char c = (char) (97 + rm.nextInt(26));
s += c;
}
arg0.execSQL("insert into TEST(NAME) values(?)", new Object[]{s});
}
}
/* (non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
*/
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
//执行查找语句
public Cursor query(String sql, String [] args){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, args);
return cursor;
}
}
编写一个List类,这个类是ListActivity的子类。使用DBServer.query方法查询表中所有数据,并返回Cursor对象。
List.java
package com.example.sqlite;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
import android.app.ListActivity;
import android.database.Cursor;
public class List extends ListActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DBServer dbServer = new DBServer(this);
Cursor cursor = dbServer.query("select * from 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);
}
}
在这里遇到的主要问题:
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
原因是使用结果集游标Cursor返回数据中,一定要有字段“_id”,否则这个类不起作用,会报如上错误。
把ID字段改成“_id”后,重新运行程序。还是出现如上问题。上网查找资料,就是因为上面这个问题引起的,已经解决了,但为什么还是会出现这个问题呢?好像记得以前进行这个操作时,也是会出现这个问题。原来是我们第一遍运行程序时,数据库已经创建在了内存里。我们虽然重新安装了程序,但是数据库还是存在在原来的地方。需要在手机或者模拟器里,把程序给卸载掉,这样它会把数据库也删掉,重新再安装程序,问题解决。
BasicDao basicDao = new BasicDao(this);
Cursor cursor = basicDao.query("select hb_id as _id,hb_train_no,hb_driver,hb_add_date from c_handbook", null);
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this,
R.layout.item_adapter,
cursor, new String[]{"hb_train_no","hb_driver","hb_add_date"}, new int []{R.id.text1,R.id.text2,R.id.text3});
listView.setAdapter(simpleCursorAdapter);
如果有多项数据,需要自己写布局。第二个参数是布局。new String[ ]参数是数据字段,new int[ ]参数是布局里面的各个textview组件ID。