使用来自SQLite数据库的项目从不同活动填充listview

时间:2011-11-30 18:15:56

标签: android sqlite android-listview android-activity

我有一个扩展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

2 个答案:

答案 0 :(得分:3)

public FOO foo = new FOO();

您永远不应该创建这样的活动,而是根据需要构建活动的框架。如果您需要这样做,请确保在FOO的构造函数中创建itemsdb(典型代码会在onCreate()中创建它,这将导致NPE在这里)。 BAR中的任何内容都没有调用FOO的onCreate,因此items并且大概db都为空。

或者,尝试重构代码,以便数据库管理代码可以在可从两个ListActivity类访问的单独类中使用。

答案 1 :(得分:0)

我建议你再创建两个类:

  • 数据库适配器类,您可以在其中处理数据库访问
  • AsyncTask的子类,用于处理向/从数据库保存/加载数据。在此任务中,您还可以使用数据填充列表视图。

也许Fragments对你的

来说是个很好的解决方案