sqlite数据库与SimpleCursorAdapter类

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值