SQLite update eines Eintrags

  • Hallo zusammen,


    ich hab eine SQLite DB
    ich möchte über einen LongClick auf einen Eintrag von der Listview einen Alertdialog öffnen, wo ich dann die Daten bearbeiten kann. Ändern funktioniert im Alertdialog ohne probleme nur sobald ich auf hinzufügen geh passiert gar nix.
    es wird der Eintrag so angezeigt wie er davor war.


    ich find den fehler einfach nicht :(


    vielen dank schonmal

  • Hast du denn auch ein Update statement?
    Wenn du auf dem alertDialog bestätigst, muss der update befehl ja ausgeführt werden... daraufhin muss die listview aktualisiert werden. Bzw. Der cursor der listview.


    Evtl. Ein paar codeschnipsel zeigen, wo du was machst...

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • ja klar sry voll verpeilt :/


    einmal das update:
    "
    public long updateEintraege( String plus_minus, String datum, Double betrag, String notiz, Integer _id) {
    int rowsupdated = 0;
    ContentValues contValues = new ContentValues();
    contValues.put(KEY_P_M, plus_minus);
    contValues.put(KEY_DATUM, datum);
    contValues.put(KEY_BETRAG, betrag);
    contValues.put(KEY_NOTIZ, notiz);


    rowsupdated = mDb.update(SQLITE_TABLE, contValues, KEY_ID +"="+_id, null);
    return rowsupdated; }
    "



    und hier der CursorAdapter:


    "
    private void displayListView() {


    Cursor cursor = dbHelper.fetchAllEintraege();


    // Spalten
    String[] columns = new String[] {
    GeldDbAdapter.KEY_P_M,
    GeldDbAdapter.KEY_DATUM,
    GeldDbAdapter.KEY_BETRAG,
    GeldDbAdapter.KEY_NOTIZ
    };


    // XML definiert welche View die Daten verbindet
    int[] to = new int[] {
    R.id.tv_plus_minus,
    R.id.tv_datum,
    R.id.tv_betrag_leer,
    R.id.tv_notiz_leer
    };


    cursorAdapter = new SimpleCursorAdapter(this, R.layout.eintrag_row, cursor, columns, to, 0);


    ListView listView = (ListView)findViewById(R.id.listView1);


    listView.setAdapter(cursorAdapter);


    listView.setOnItemClickListener(new OnItemClickListener() {


    @Override
    public void onItemClick(AdapterView<?> listView, View view, int position, long id) {


    //Positioniert den Cursor zur entsprechenden Zeile im ResultSet
    Cursor cursor = (Cursor)listView.getItemAtPosition(position);


    //Holt sich aus den Zeilen die Daten
    idCode = Integer.parseInt(cursor.getString(cursor.getColumnIndexOrThrow("_id")));
    plus_minusCode = cursor.getString(cursor.getColumnIndexOrThrow("plus_minus"));
    betragCode = Double.parseDouble(cursor.getString(cursor.getColumnIndexOrThrow("betrag")));
    notizCode = cursor.getString(cursor.getColumnIndexOrThrow("notiz"));
    datumCode = cursor.getString(cursor.getColumnIndexOrThrow("datum"));

    }
    }); "


    sry aber des mit dem Code einfügen haut irgendwie nicht immer hin :o

  • Sorry dass ich so spät antworte... ich bekomme irgendwie keine Benachrichtigungen mehr per Mail.


    Also das Update sieht ok aus.... nachdem du ein Update gemacht hast, musst du die listView ja nicht aktualisieren, sondern nur den cursor.


    ich lade bei mir den cursor in so einem Fall ganz neu, aber du kannst ja mal cursor.requery(); probieren.
    Und zwar nachdem das Update gemacht wurde. um in der updateEintraege Methode zugriff auf deinen cursor zu bekommen, musst du ihn aus der displayListView Methode raus holen, also ihn als Eigenschaft der Klasse definieren (Feldvariable). Sodass jede Methode in der Klasse darauf zugreifen können.


    man... seit wenigen Wochen nichts mehr in Android gemacht und schon kann ich mich nicht ausdrücken :D
    Ich hoffe das hilt dir erstmal so weiter, ich versuche mich jetzt aber nochmal klarer auszudrücken

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Um Code hier im Forum richtig einzufügen, musst du nicht auf "schnellantwort" drücken, sondern den richtigen "Antwort" Button drücken, in dem sich öffnenden Editor gibt es oben in der Bearbeitungsleiste ein JavaSymbol (Die Kaffeetasse) da drückst du drauf, es wird [ java] [ /java] in den Textbereich reingeschrieben, und dazwischen kopierst du deinen Code rein. dann wird das so angezeigt


    Java
    private void listeAktualisieren(int filter, Cursor c) {
    		CursorAdapter adapter = null;
    
    
    		// Status anzeigen bzw. ausblenden
    		boolean showStatus = true;
    		if (filter != -1) {
    			showStatus = false;
    		} . . .


    Also zurück zum Thema...


    zeig mal die Stelle, von wo aus deine updateEintraege(...) Methode aufgerufen wird... genau danach muss nämlich der Cursor aktualisiert werden.

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • also so ganz hab ichs glaub ich nicht verstanden was du meinst :/


    updateEintraege() ist in der klasse DbAdapter drinnen.
    und in der klasse LvCursorAdapter wird dann

    Code
    public void eintragUpdate() { dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null);
     displayListView();
        }


    aufgerufen


    würd ja gern den code von den klasse mal posten, aber der code wird jedesmal in eine zeile zusammen gefasst :/


    danke schonmal für deine Hilfe :)

  • Wo werden die Variablen (new_plus_minus, new_datum, new_betrag, new_notiz,..) definiert, was steht in der Methode displayListView()?
    Und ich glaube es kommt kein Update der Daten zustande, weil


    Java
    dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null);


    keine ID oder sowas bekommt, also keinen Geneuen Ort in der Tabelle bearbeiten kann(?) ... Vermutung



    vielleicht mal versuchen die Klassen als Anhang zu posten, damit man sich mal ein Bild von allem machen kann... ist so etwas schwierig zu verstehen was genau geschieht...

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Zitat

    die methode displayListView hab ich eigentlich schon gepsotet :/


    Sorry, hab ich grad auch wieder gesehn. da ist aber alles gut. Der zeigt beim ersten mal ja wohl auch richtig an.


    Zwei Dinge fallen mir auf, die vermutlich das Problem sind. Zum einen..


    Java
    public void eintragUpdate() {
            dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null);
    //      displayListView();
              
        }


    Da wo am Ende "null" steht, muss eine ID rein. Damit deine SQLite DB in ihrer updateEintraege(...) Methode weiß in welchem Datensatz er das Update machen soll.
    Hier nochmal die Methode aus der Datenbankklasse:



    rowsupdated = mDb.update(SQLITE_TABLE, contValues, KEY_ID +"="+_id, null);


    das ist das Update. Und er macht das Update nur für den Datensatz, dessen Zeile die ID hat, die in _id drin steht.
    Da du dort keine ID, sondern "nichts" übergibts, wird auch nichts in der Datenbank verändert. (seltsam dass da keine Exception kommt)


    Aber wenn ich das richtig sehe, dann hast du die ID in der Variable idCode schon drin stehn, dass heißt du schreibst statt "null" einfach "idCode" hin
    und in


    Java
    public void eintragUpdate() {
            dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null);
    //      displayListView();
              
        }


    machst du displayListView(); wieder aktiv, also kein Kommentar draus. Dann Probier nochmal.



    ------------------------------------------
    Das eben erklärte musst du auf jeden fal machen.


    Wenn es dann noch nicht läuft, dann überprüf auch in der Klasse LvCursorAdapter...


    Java
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                          
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                  
                                if (chk_bx.isChecked() == false) 
                                {
                                    eintragUpdate();
                                      
                                } else {



    Könntest du mal einen Haltepunkt bei "eintragUpdate();" setzen und deine App dann mal im Debugging Modus starten und dann testen, ob es überhaupt bis zu diesem Punkt kommt?..


    (Haltepunkt setzt du, indem du links neben der Zeile im Orangenen Bereich doppelklickst, bzw. Rechtsklickst und "Toggle Breakpoint" auswählst.
    Den Debugging Modus startest du mit dem grünen Käfersymbol, genau neben dem Normalen "Play" Button)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

    2 Mal editiert, zuletzt von Funtik ()

  • leider funktioniert es so auch nicht.


    habs jetzt geändert auf

    Java
    public void eintragUpdate() {	dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, idCode);	displayListView();}


    beim debuggen geht er ohne probleme bis zum eintragUpdate();

    des displayListView(); hab ich auch nur zum testen mal auskommentiert nur vergessen wieder rein zumachen^^


    wo könnte sonst noch der fehler liegen?


    danke dir für deine Mühe :)


    edit: wen ich auf hinzufügen geh passiert wieder nix... die zeile schaut aus wie davor obwohl ich mehrere sachen ändere


  • okay gut. Dann weiter... :D


    Wenn du aus der Liste raus gehst, und sie wieder öffnest, sind die Daten immernoch die alten, richtig? (nur damit ich jetzt auf dem richtigen weg gucke)


    Mach mal zum Test folgendes:


    Java
    public void eintragUpdate() { 
            long diesDas = 0;
            diesDas = dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null); 
            Toast.makeText(getApplicationContext(), "rows Updated: " + diesDas + " : " + new_plus_minus + " : " + new_betrag + " : " + new_datum + " : " + new_notiz + ": id=" + idCode, Toast.LENGTH_LONG).show();
           displayListView(); 
              
        }


    Die Toast zeile müsstest du evtl. noch bearbeiten, das war jetzt frei aus der Hand geschrieben.
    Und guck mal ob beim Ausführen im Toast die neuen Daten stehen. Achte darauf, welche Zahlen am Anfang und am Ende des Toasts stehen werden. Beide Zahlen müssen größer als 0 sein..


    edit2: nochmal, da hat nochwas gefehlt. hab die Methode nochmal geändert. (falls du schon probierst)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

    2 Mal editiert, zuletzt von Funtik ()

  • hab folgende eingabe gemacht:
    betrag = 3.99 vorher 23.99
    notiz = tester vorher test
    datum = 27.5 vorher 28.5
    plus auf minus geändert


    folgendes kommt beim toast raus
    rows Updated: 0 : + : 23.99 : 28.5.2013 : test : id=2
    also es wird nix geändert

  • Das heißt deine update Methode bekommt schon die alten Daten. Also kann sich auch nichts ändern.
    rowsUpdatet steht 0, aber darum kümmern wir uns dann später.


    Magst du mal schritt für schritt Screens machen, also öffnen der Liste und öffnen des AlertDialogs..


    Ist es der selbe Dialog, mit dem du auch neue Einträge machst?

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • also hier meine main.xml
    die app öffnet sich gleich in der listview


    https://www.dropbox.com/s/ucqpm3ven29wwfk/main.png



    wen man auf den grünen + Button geht kommt der alertdialog(sry dass das bild so schlecht ist der emulator hat scheinbar probleme mit dem alertdialog beim screenshot)


    https://www.dropbox.com/s/rqgk0ryhud4b7oi/add.png



    beim longCLick auf ein item öffnet sich dann der selbe alertdialog nur mit der checkbox als visible


    https://www.dropbox.com/s/5hw0dwaux807o69/edit.png

  • Okay danke. Die Bilder sind nur, damit ich mir ein besseres Bild machen kann.


    Bin nochmal den Code durchgegangen. Es sieht so aus, dass du die Daten zu früh in die new - Variablen rein packst. Und zwar schon beim öffnen des Dialogs. Du musst die Daten erst beim klicken of OK in die Variablen schreiben, also



    edit: Beim Erstellen eines neuen Eintrags machst du das richtig, da passiert das beim Klicken. Beim Bearbeiten aber schon beim Aufbau des Dialogs. Ist zu früh, da die Variablen ja keine direkte Referenz zum Datenbankinhalt ist, sondern nur den Wert in sich kopiert.

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

    Einmal editiert, zuletzt von Funtik ()

  • Ja ich weiß, sagte ich ja bereits...


    ....
    rowsUpdatet steht 0, aber darum kümmern wir uns dann später.


    Wenn du die App neu öffnest, sind die Daten ja auch immernoch die Alten, richtig? Da bei rows Updated 0 steht bedeutet das dass 0 Datensätze, also Zeilen in der Datenbank, verändert wurden.


    Edit: magst du die LvCursorAdapter.java in deiner Dropbox nochmal aktualisieren bitte?

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Java
    public void eintragUpdate() { 
            long diesDas = 0; 
            diesDas = dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, null); 
            Toast.makeText(getApplicationContext(), "rows Updated: " + diesDas +" : " + new_plus_minus + " : "+ new_betrag + " : " + new_datum + " : " + new_notiz + ": id=" + idCode, Toast.LENGTH_LONG).show(); 
            displayListView(); 
              
        }


    Hast vergessen null durch idCode zu ersetzen, also...


    Java
    diesDas = dbHelper.updateEintraege(new_plus_minus, new_datum, new_betrag, new_notiz, idCode);


    Dann probier nochmal

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • jawohl! super danke dir^^


    endlich funktionierts :D



    edit: hät evtl noch eine kleine frage^^
    weißt du wie ich das "+" bzw "-" in der liste rot bzw grün machen kann? hab schon mehrere sachen probiert mit Ressource/setColor etc aber alles hatte keine auswirkung drauf

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!