我无法让这个工作,我看了很多帖子,我真的很绝望,因为我必须完成这个直到后天。问题如下:
我有一个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个选项卡中运行了同样的活动。这可能是原因吗?
答案 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
方法 - 只有在没有时才触发,因此在进行修正后删除数据库很重要,然后重新运行应用程序。
我希望有所帮助。