【问题标题】:How to delete items from SQLite database through the context menu?如何通过上下文菜单从 SQLite 数据库中删除项目?
【发布时间】:2019-11-10 23:27:51
【问题描述】:

请帮助我理解。我有一个应用程序,我在其中将项目添加到数据库,然后将其显示在 ListView 上。几乎所有工作正常,但是当我通过上下文菜单删除项目时,顶部的第一个项目被删除。无论我选择哪个项目。

@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, view, menuInfo);

    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.delete_menu_item:
            String itm_ps = itemView.getItemAtPosition(itemPos).toString();
            ToDoDB.deleteData(itm_ps);
            mAdapter.remove(itm_ps);
            return true;

        case R.id.quit_menu_item:
            finish();
            return true;

        default:
            return super.onContextItemSelected(menuItem);
    }
}

及SQL查询代码:

public int deleteData(String value) {
    SQLiteDatabase database = this.getWritableDatabase();
    Cursor cursor = database.query(TABLE_NAME,null, null, null, null, null, null);
    if (cursor.moveToFirst()) {
       delete_result = database.delete(TABLE_NAME, KEY_ID + "=?", new String[]{value});
       database.close();
    }
    return delete_result;
}

public Cursor viewData() {
    SQLiteDatabase database = this.getReadableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME;
    Cursor cursor = database.rawQuery(query, null);

    return cursor;
}

【问题讨论】:

  • 请仔细检查您的措辞“当我通过上下文菜单删除项目时,顶部的第一项被删除”。你的意思是“当我通过上下文菜单删除项目时,顶部的第一个项目被删除”?
  • 是的。我想删除我在列表视图中选择的项目。从列表视图和数据库中删除项目。

标签: java android sqlite listview contextmenu


【解决方案1】:

在你的 sql 数据库中试试这个。

public void delete(String time) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_ID + " = ?", new String[]{time});
        db.close();
    }

也可以这样称呼:

@Override
public boolean onContextItemSelected(MenuItem menuItem){
    switch(menuItem.getItemId()) {
        case R.id.delete_menu_item:

            AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            String key = ((TextView) info.targetView).getText().toString();
            db.delete(String.valueOf(key));
            mAdapter.notifyDataSetChanged();
//  Load items to the database once more like you would do at startup of the application.
            return true;
   }
}

【讨论】:

  • 哦,现在让我看看这个错误:java.lang.IllegalArgumentException:绑定参数太多。提供了 1 个参数,但该语句需要 0 个参数。
  • db.delete(String.valueOf(key));和 db.delete(TABLE_NAME, KEY_ID + " = ?", new String[]{time});
  • 在 ListView 中:id = 0 - 第一项。 id = 1 - 第二项。在我的数据库中 id = 7 -第一项。 id = 8 - 第二项。 ID 不匹配。
  • 从你的代码中删除这一行并检查mAdapter.remove(itm_ps);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多