排错经验:不要因为某个变量简单熟悉就忽略对该值的检查,由此体现代码的健壮的重要性。
报错:NullPointException,错误处:lv.setAdapter(adapter);
也就是说,lv或adapter传值为空。
前期把精力全部投入到SimpleCursorAdapter,包括“_id”和API 11新出现的SimpleCursorAdapter的构造方法中出现的新的变量flags。(flags即标志,FLAG_REGISTER_CONTENT_OBSERVER的标志,即说明这个适配器是否注册到CONTENT_OBSERVER)
…..
最后通过:
if(lv != null){
if(adapter != null){
lv.setAdapter(adapter);
}else{
Log.v("空值", "adapter为空");
}
}else{
Log.v("空值", "lv为空");
}
發現是lv的值為空。
package com.study.test02;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.study.port.SQLiteHelper;
/**
* 数据库SQLite访问
*
* @author lenov
*
*/
public class Activity_01 extends Activity {
ListView lv;
SQLiteHelper helper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity01);
lv = (ListView)findViewById(R.id.lv_activity01);
helper = new SQLiteHelper(this, 1);
db = helper.getWritableDatabase();
/**
* 两种查询方式,query()和rawQuery()
*/
Cursor cursor = db.query("contacts", new String[] { "_id", "name",
"telphone" }, null, null, null, null, null);
// Cursor cursor = db.rawQuery(
// "select name,telphone from contacts where _id > ?",
// new String[] { "1" });
// CursorAdapter
CursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.layout_cursor, cursor,
new String[] { "name", "telphone" }, new int[] {
R.id.name_layout_cursor, R.id.phone_layout_cursor },0);
if(lv != null){
if(adapter != null){
lv.setAdapter(adapter);
}else{
Log.v("空值", "adapter为空");
}
}else{
Log.v("空值", "lv为空");
}
/*
* 结果集Cursor的访问
*/
// if (cursor.getCount() > 0) {
// cursor.moveToFirst();
// do {
// String name = cursor.getString(1);
// String telphone = cursor.getString(2);
// Log.i("提示", name+telphone);
// } while (cursor.moveToNext());
// }
}
}