contextMenu中所选项目的ID始终为0

时间:2012-01-17 20:59:04

标签: java android database eclipse contextmenu

我无法让这个工作,我看了很多帖子,我真的很绝望,因为我必须完成这个直到后天。问题如下:

我有一个listView,其中包含数据库中的条目。可以长按它们来调用contextMenu。在上下文菜单中,我可以删除或编辑条目,为此,我需要所选项目的ID。

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater2 = getMenuInflater();
  inflater2.inflate(R.menu.edit_grade_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info =  (AdapterContextMenuInfo) item.getMenuInfo();
  int id = (int) info.id;
  switch (item.getItemId()) {
  case R.id.edit_grade:
    Intent i = new Intent(this, AddGradeActivity.class);
    i.putExtra(GradesDbAdapter.KEY_ROWID, linkSubject);

    // putExtra edit, so addGradeActivity knows it has to fill views with values to edit grade
    i.putExtra("edit", true);
    i.putExtra(GradesDbAdapter.KEY_GRADE, id);
    this.startActivity(i);
    finish();

    return true;
  case R.id.del_grade:
      myDbHelper.deleteGradeEntry(id, semester);
      // filldata to refresh listview
      fillData();
    return true;
  default:
    return super.onContextItemSelected(item);
  }
}

现在我的问题是我从info获得的这个id总是为0.这真的很奇怪,因为它在我更改布局之前已经工作了,我在同一个屏幕上的2个选项卡中运行了同样的活动。这可能是原因吗?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。它不是在实现ListView的上下文菜单/类中发生,而是在创建数据库表,_id列期间发生。使用此语法时:

db.execSQL("CREATE TABLE TABLE_NAME(_id INTEGER AUTO INCREMENT PRIMARY KEY,  TITLE TEXT, VALUE REAL);");

AdapterView.AdapterContextMenuInfo.id始终返回0

但是,如果使用此语法:

db.execSQL("CREATE TABLE TABLE_NAME(_id INTEGER PRIMARY KEY AUTOINCREMENT,  TITLE TEXT, VALUE REAL);");

AdapterView.AdapterContextMenuInfo.id始终返回正确的ID。

所以之间存在差异:

_id INTEGER AUTO INCREMENT PRIMARY KEY 

_id INTEGER PRIMARY KEY AUTOINCREMENT

第二部作品,首先没有。调试的难点在于两者在语法上都是正确的。

另一个重要的事情是,在重新运行应用程序之前需要通过adb终端从应用程序中删除数据库对象,因为如果数据库已经存在,则不会触发扩展onCreate的类的SQLiteOpenHelper方法 - 只有在没有时才触发,因此在进行修正后删除数据库很重要,然后重新运行应用程序。

我希望有所帮助。