Android 如何从sqlite中删除listview中的数据?

Android 如何从sqlite中删除listview中的数据?,android,sqlite,listview,Android,Sqlite,Listview,我在上下文菜单中创建了一个删除选项。删除功能正在工作,但存在问题。无论我选择删除listview中的哪个项目,它都只会删除最后一个项目。如何删除要删除的项目 public class Watchlist extends ListActivity { private ArrayList<String> results = new ArrayList<String>(); private String tableName = DatabaseHandler.TABLE_IT

我在上下文菜单中创建了一个删除选项。删除功能正在工作,但存在问题。无论我选择删除listview中的哪个项目,它都只会删除最后一个项目。如何删除要删除的项目

public class Watchlist extends ListActivity {

private ArrayList<String> results = new ArrayList<String>();
private String tableName = DatabaseHandler.TABLE_ITEM;
private SQLiteDatabase newDB;

String pid, iid, name, price, date, type;
private ArrayAdapter<String> adapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    openAndQueryDatabase();
    setContentView(R.layout.activity_watchlist);
    displayResultList();
}

private void displayResultList() {
    TextView tView = new TextView(this);
    tView.setText("This data is retrieved from sqlite");
    ListView lv = getListView();
    lv.addHeaderView(tView);
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, results);
    lv.setTextFilterEnabled(true);
    lv.setAdapter(adapter);
    registerForContextMenu(lv);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, v.getId(), 0, "Delete");

}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
            .getMenuInfo();
    // info.position will give the index of selected item
    int menuItemIndex = info.position;

    String menuItemIndexS = String.valueOf (menuItemIndex);
    Log.d ("value",menuItemIndexS);
    if (item.getTitle() == "Delete") {
        DatabaseHandler db = new DatabaseHandler(Watchlist.this);
        Log.d("Delete: ", "Deleting .."); 
        int pidI = Integer.parseInt(iid);

        db.deleteItem(new Items(pidI, name, price, date, type));
        Intent i = new Intent(this, Watchlist.class);
        startActivity(i);
        finish();
    }
    return true;
}

private void openAndQueryDatabase() {
    try {
        DatabaseHandler db = new DatabaseHandler(Watchlist.this);
        newDB = db.getWritableDatabase();
        Cursor c = newDB.rawQuery("SELECT * FROM " + tableName, null);

        if (c != null) {
            if (c.moveToFirst()) {
                do {
                    pid = c.getString(c.getColumnIndex("id"));
                    iid = c.getString(c.getColumnIndex("iid"));
                    name = c.getString(c.getColumnIndex("name"));
                    price = c.getString(c.getColumnIndex("price"));
                    date = c.getString(c.getColumnIndex("created_at"));
                    String type = c.getString(c.getColumnIndex("type"));
                    results.add("Name: " + name + "\nPrice: " + price
                            + "\nDate posted: " + date + "\nItem type: "
                            + type);
                } while (c.moveToNext());
            }
        }
    } catch (SQLiteException se) {
        Log.e(getClass().getSimpleName(),
                "Could not create or Open the database");
    } finally {
        if (newDB == null)
            newDB.execSQL("DELETE FROM " + tableName);
        newDB.close();
    }

}
}

您正在使用iid字符串变量。它们是从数据库中检索的,它存储最后一个iid值,因为您正在从表中获取所有值。根据我的理解:- 你的密码。将iid更改为info.position

 if (c.moveToFirst()) {
                do {
                    pid = c.getString(c.getColumnIndex("id"));
 **/*that's why it's deleting last item :-) **/
                    iid = c.getString(c.getColumnIndex("iid"));**
                    name = c.getString(c.getColumnIndex("name"));
                    price = c.getString(c.getColumnIndex("price"));
                    date = c.getString(c.getColumnIndex("created_at"));
                    String type = c.getString(c.getColumnIndex("type"));
                    results.add("Name: " + name + "\nPrice: " + price
                            + "\nDate posted: " + date + "\nItem type: "
                            + type);
                } while (c.moveToNext());
            }
iid是一个全局变量。您正在更改它在do中的值。。。openAndQueryDatabase方法中的while循环。这就是为什么在onContextItemSelected中,iid的值将是数据库查询中的最后一个值

解决问题的快速方法是使用另一个ArrayList在循环中存储resultsIds:

results.add("Name: " + name + "\nPrice: " + price
                            + "\nDate posted: " + date + "\nItem type: "
                            + type);
resultsId.add(iid);
然后在onContextItemSelected中:


代码有很多问题。考虑在调试器中运行它,在不同的点检查程序状态——在这个过程中你会学到很多东西。我得到的无效索引项索引大小是正常的,在使用它之前,必须先初始化结果集并添加ID。我想给你举个例子!检查我编辑的答案。同样的问题,仍在删除最后一项
db.deleteItem(new Items(resultsId.get(menuItemIndex ), name, price, date, type));
adapter.remove(adapter.getItem(info.position));