Eintrag in einer Datenbank mithilfe einer ListView löschen

D

DoctorBlack

Neues Mitglied
Threadstarter
public int loescheFach(long id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete("Fach_table","FACHID=?", new String[]{String.valueOf(id)});
}
Hallo,

ich habe eine normale Datenbank mit SQLite erstellt. Über einen Button lasse ich die Daten dann in einer ListVIew anzeigen. Jetzt möchte ich die Daten aus der ListView bzw. aus der Datenbank löschen, also so, dass wenn ich ein Item in der ListVIew z.B. länger gedrückt halt, sowohl aus der ListView als auch aus der Datenbank gelöscht wird. Ich hab das schon mit einem OnItemLongClickListener probiert, leider will das nicht so ganz funktionieren. Danke schon mal für die Hilfe im Voraus :)

Hier einmal die Klasse zum Anzeigen in der ListVIew:

public class ZeigeFaecherListe extends AppCompatActivity {

DatabaseHelper myDb;
Cursor res;
ListView listViewFaecher;


@override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zeige_faecher);

myDb = new DatabaseHelper(this);
ListView listViewFaecher = (ListView) findViewById(R.id.listViewFaecher);

ArrayList<String> faecherListe = new ArrayList<>();
res = myDb.zeigeFaecher();





if (res.getCount() == 0){
Toast.makeText(ZeigeFaecherListe.this, "Keine Fächer gefunden", Toast.LENGTH_LONG).show();
} else {
while (res.moveToNext()){
faecherListe.add(res.getString(1));
ListAdapter fachListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, faecherListe);
listViewFaecher.setAdapter(fachListAdapter);
}
}

listViewFaecher.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
myDb.loescheFach(position);
return true;
}
});
}
}

Und hier noch die Methode zum Löschen des EIntrags:
public int loescheFach(long id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete("Fach_table","FACHID=?", new String[]{String.valueOf(id)});
}

 
J

jogimuc

Erfahrenes Mitglied
Hallo
um einen Eintrag in der DB zu löschen brauchst du die ID des Datensatzes. Die kannst du dir bestimmt aus dem Cursor holen.

>public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
myDb.loescheFach(position);

Hier übergibst du die Position der Liste damit kann die DB nichts anfangen auch die übergebene ID „long id“ ist die falsche . Du brauchst die Id des Datensatzes unter dem der Eintrag in der DB gespeichert ist. Normaler weise wird in einer Tabelle die ID als erster Eintrag gespeichert wie das bei dir ist kann ich nicht sehen.
Um die Id zu bekommen benutze deinen Cursor "res" setze ihn auf die Position die dir übergeben wird und lese den Datensatz aus und somit auch die id.


Nach dem löschen list du die Daten neu aus der DB aus in deine Liste, Adapter und zeigst sie neu an.
 
Zuletzt bearbeitet:
D

DoctorBlack

Neues Mitglied
Threadstarter
Ich hab mich mit dem Thema Cursor noch nicht wirklich beschäftigt, kannst du mir da vielleicht ein bisschen auf die Sprünge helfen?

Ich hab hier nochmal mein Projekt auf GitHub verlinkt wenn das weiter hilft: JDR3/Stundenplan
 
J

jogimuc

Erfahrenes Mitglied
Hallo habe mir den Projekt von github geClonet.
hier der geänderte Code

public class ZeigeFaecherListe extends AppCompatActivity {


SQLiteDatabase db;
DatabaseHelper myDb;
Cursor res;
ListView listViewFaecher;
private AlertDialog.Builder build;
ArrayList<String> faecherListe = new ArrayList<>();


@override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zeige_faecher);


myDb = new DatabaseHelper(this);
listViewFaecher = (ListView) findViewById(R.id.listViewFaecher);


zeigeListe();

listViewFaecher.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long id) {
build = new AlertDialog.Builder(ZeigeFaecherListe.this);
build.setTitle("Fach löschen?" + faecherListe.get(position));
build.setMessage("Willst du das Fach wirklich löschen?");

build.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});

build.setPositiveButton("Löschen", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {

res.moveToPosition(position);
// myDb.loescheFach(res.getString(1));
myDb.loescheFach(res.getLong(0));

Toast.makeText(getApplicationContext(), faecherListe.get(position) + " gelöscht.", Toast.LENGTH_LONG).show();
myDb.zeigeFaecher();
dialogInterface.cancel();
zeigeListe();

}
});

AlertDialog alert = build.create();
alert.show();

return true;
}
});





}

public void zeigeListe(){

res = myDb.zeigeFaecher();
faecherListe.clear();
if (res.getCount() == 0){
Toast.makeText(ZeigeFaecherListe.this, "Keine Fächer gefunden", Toast.LENGTH_LONG).show();
} else {
while (res.moveToNext()){
faecherListe.add(res.getString(1));

}
ListAdapter fachListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, faecherListe);
listViewFaecher.setAdapter(fachListAdapter);
}



}

}

in der DBHelperklasse habe ich auch was geändert.

public int loescheFach(String fach) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, FACH_NAME+"=?", new String[]{fach});

}

public int loescheFach(long id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, FACH_ID+"=?", new String[]{String.valueOf(id)});

}

solte nun gehen.
 
D

DoctorBlack

Neues Mitglied
Threadstarter
Hallo,

hat funktioniert. Dickes Dankeschön :biggrin:

Hast mir echt weiter geholfen!
 
J

jogimuc

Erfahrenes Mitglied
Bitte , ich hoffe du verstehst warum ich mansches verändert habe. Hauptsächlich lag es an der löschmethode im helper.
Nun hast du zwei und kannst entscheiden ob du nach id oder dem String Fach löschst.
Beim String werden alle die den gleichen String haben gelöscht. Denn es kann sein das das Fach gleich ist aber die anderen Daten nicht die würden dann auch mit gelöscht werden.
Bei id ist es immer nur ein Datensatz denn es gibt die Id nur ein mal in der Tabelle.
-- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
Hi mal eine Frage.
Warum machst du das mit den konstanten für die Tabelle. Ich persönlich komme damit durch einander.
In deiner löschmethode war das auch so. Die meisten tutorial gehen von strings aus.
Da wirst du auch durcheinander gekommen sein.
 
D

DoctorBlack

Neues Mitglied
Threadstarter
Ich kann dann in den ganzen Lösch- und Speicher-Methoden die Variabelnamen aufrufen, dachte das wäre so geschickter, habe das alles nach einem Tutorial gemacht.
 
Oben Unten