从数据库中删除SQLite Android

时间:2017-01-06 20:19:16

标签: android sqlite android-sqlite sql-delete

我有问题。我尝试从数据库中删除记录。我不知道,但怎么做。我试过这样的事,但不太合适。 基本要点是我试图根据列表项位置从数据库中删除,而不是数据库行ID。如何删除基数据库的行ID?

ListView listawszystkich;
public int pozycja;
DatabaseDEO db = new DatabaseDEO(this);
final String[] skad = new String[]{Database.tables.Transakcje.Kolumny.kwota, Database.tables.Transakcje.Kolumny.data, Kategorie.KOLUMNY.nazwa_kategorii, Database.tables.Transakcje.Kolumny.komentarz};
final int[] dokad = new int[]{R.id.kwotaglowna,R.id.dataglowna,R.id.kategoriaglowna,R.id.komentarzglowny};
private SimpleCursorAdapter adapterspinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_transakcje2);

    listawszystkich = (ListView) findViewById(R.id.listawszystkich);

    listawszystkich.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            pozycja = position+1;
        }
    });
    Cursor kursorwszystkie = db.wszystkietransakcje();
    adapterspinner = new SimpleCursorAdapter(getApplicationContext(), R.layout.activity_transakcje,kursorwszystkie,skad, dokad,0);
    adapterspinner.notifyDataSetChanged();
    listawszystkich.setAdapter(adapterspinner);
    registerForContextMenu(listawszystkich);

}



@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    if (v.getId()==R.id.listawszystkich) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_list,menu);
    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.delete:
            db.usuwanietransakcji(pozycja);
            Transakcje.this.recreate();
            Toast.makeText(getApplicationContext(), "Delete", Toast.LENGTH_SHORT).show();
        default:
            return super.onContextItemSelected(item);
    }

删除行的方法(在DatabaseDEO中):

    public void usuwanietransakcji(int id_transakcji){
    SQLiteDatabase db = DbHelper.getWritableDatabase();
    db.execSQL("DELETE FROM " + Transakcje.NAZWA_TABELI+ " WHERE "+Transakcje.Kolumny.id_transakcji+"='"+id_transakcji+"'");
    db.close();
}

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试根据列表位置而不是行ID从数据库中删除:

db.usuwanietransakcji(pozycja);

我猜id_transakcji是一个类似于行ID的唯一值?首先,您需要将Cursor kursorwszystkie声明为onCreate方法之外的成员变量,但仍然将其填充到同一行。

onContextItemSelected()中,您需要再次查询光标:

case R.id.delete: {
        // Move to the selected row
        kursorwszystkie.moveToPosition(info.position);

        // Get the column ID of id_transakcji
        final int col_id = kursorwszystkie.getColumnIndex(Database.tables.Transakcje.Kolumny.id_transakcji);

        // Get id_transakcji
        final int id_transakcji = kursorwszystkie.getInt(col_id);

        // Query the database
        db.usuwanietransakcji(id_transakcji);
        Transakcje.this.recreate();
        Toast.makeText(getApplicationContext(), "Delete", Toast.LENGTH_SHORT).show();
        break;
}

请注意添加{},因为我在切换案例中声明了一个变量。同时在案例末尾添加break;,以便代码不会落入default块。如果有效,请告诉我。