【发布时间】:2011-11-30 18:15:55
【问题描述】:
我有一个扩展 ListActivity 的类,我拥有管理数据库项目的所有方法:insertItems()、getItems()、showItems() 等。当我使用数据库中的项目填充此列表视图时,一切都很好。我想要做的是以同样的方式从另一个活动中填充另一个 ListView,但是当我试图将光标传递给该活动时,我得到 NullPointer 异常。我尽量说最有代表性的。
public class FOO extends ListActivity{
//...
public static DBAdapter items;
@override
public void onCreate(){
//...
items = new DBAdapter(this);
//...
}
public static Cursor getAllItems() {
// TODO Auto-generated method stub
db = items.getReadableDatabase();
return db.query(DBConstants.TABLE_NAME, FROM, null, null, null, null, null);
}
那么,在我的第二个活动中:
public class BAR extends ListActivity{
//.....
public FOO foo = new FOO();
Cursor cursor;
//...
public static DBAdapter items;
@override
public void onCreate(){
//...
items = new DBAdapter(this);
foo.insertItems(//arguments);
this.cursor = foo.getAllItems();
this.startManagingCursor(this.cursor);
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, FROM, TO);
setListAdapter(adapter);
}
我首先得到的是这个错误,其中 MainActivity = BAR
E/AndroidRuntime(22923): java.lang.RuntimeException: Unable to start activity ComponentInfo{your.pack.databasae/your.pack.databasae.MainActivity}: java.lang.NullPointerException
【问题讨论】:
-
能否包含项目的实例化?它看起来好像是一个 SQLiteOpenHelper,如果没有 Context 的实例(例如,一个 Activity)就无法实例化它,但是你从一个没有这样的实例的静态方法返回它。我的猜测是它的项目是空的。
-
是的,你没看错,DBAdapter 是扩展 SQLiteOpenHelper 的类。我在两个类中都以相同的方式实例化了 items,我不知道是否可以....
-
好的,我现在知道了。 Foo 的实例起什么作用?在没有看到 Foo.insertItems 的情况下,我猜测它在一个单独的静态 DBAdapter 实例上运行,该实例预计将在 Foo 的 onCreate 方法中实例化。在每个活动的生命周期内实例化和使用 DBAdapter 可能会更好,而且绝对不是静态的。而且您根本不应该实例化其他活动。我希望这会有所帮助。如果不能随意包含整个堆栈跟踪。
标签: android sqlite android-listview android-activity