"UPDATE" SQlite Datenbank funktioniert nicht

  • 7 Antworten
  • Letztes Antwortdatum
R

RoboTH

Gast
Hi,

ich habe schon diverse Tutorials angeguckt, aber mein Fheler will sich (zumindest von mir) einfach nicht ausmerzen lassen...

Und zwar habe ich eine Datenbank mit folgenden Daten:

Code:
// normal vouchers table name
    public static final String DATABASE_TABLE_NORMAL_VOUCHERS = "List_Vouchers_normal";
// voucher table columns names and number
    public static final String KEY_ID = "_id";
    public static final String KEY_TITLE = "title";
    public static final String KEY_DESCR = "description";
    public static final String KEY_CATEGORY = "category";
    public static final String KEY_GIVEN = "given";
    public static final String KEY_FAVED = "faved";
    public static final String KEY_USED = "used";
Meine Update-Methode sieht wie folgt aus:
Code:
public boolean updateField(final String tableName, final int rowID,
            final String columnName, final String updateValue) {
        SQLiteDatabase db = this.getReadableDatabase();

        // ID may not be replaced!
        if (columnName.equals(KEY_ID)) {
            return true; // you never want to return false!
        }
        if (columnName.equals(KEY_FAVED) || columnName.equals(KEY_GIVEN)
                || columnName.equals(KEY_USED)) {
            // write integer instead of String to Database field as column requires!
            Log.e("updateField", "SETTING VALUE updateValue = " + updateValue);
            db.execSQL("UPDATE " + tableName + " SET " + columnName + " = '"
                    + Integer.parseInt(updateValue) + "' WHERE " + KEY_ID
                    + "='" + rowID + "';");
        } else {
            // normal execution (write String to field)
            db.execSQL("UPDATE " + tableName + " SET " + columnName + " = '"
                    + updateValue + "' WHERE " + KEY_ID + " = '" + rowID + "';");
        }
        return true;
    }
Nur leider wird das Feld der Spalte "faved" in der Reihe "id" (wird zur Laufzeit variabel gesetzt) bei folgendem Aufruf nicht von "1" auf "0" geupdatet :mad2:
Code:
mHelper.updateField(DatabaseManager.DATABASE_TABLE_NORMAL_VOUCHERS,
                            id, DatabaseManager.KEY_FAVED, "0");
Seht Ihr den Fehler? Ich verzweilfe bald daran.
Danke schon mal vorab :smile:
 
Zuletzt bearbeitet:
Habe die Update-Funktion umgebaut:

Code:
public boolean updateField(final String tableName, final int rowID,
            final String columnName, final String updateValue) {
       
        SQLiteDatabase db = this.getReadableDatabase();
        String strFilter = "_id=" + rowID;
        ContentValues valueUpdate = new ContentValues();

    if (columnName.equals(KEY_ID)) {
        return true; // you never want to return false!
    }
    if (columnName.equals(KEY_FAVED) || columnName.equals(KEY_GIVEN)
            || columnName.equals(KEY_USED)) {
        // write integer instead of String to Database field as column requires!
        valueUpdate.put(columnName, Integer.parseInt(updateValue));
        db.update(tableName, valueUpdate, strFilter, null);
    } else {
        // normal execution (write String to field)
        valueUpdate.put(columnName, updateValue);
        db.update(tableName, valueUpdate, strFilter, null);
    }
    return true;        
    }

Tut sich auch nichts :thumbdn:

Der ursprüngliche Beitrag von 18:44 Uhr wurde um 18:49 Uhr ergänzt:

Habe einen/den Fehler gefunden!

Wenn ich die Zeile
Code:
String strFilter = "_id=" + (rowID);
in
Code:
String strFilter = "_id=" + (rowID + 1);
ändere klappt alles!

Eine generelle Frage dann:

Fangen die SQlite Datenbanken-Zeilen immer mit 1 an? Ich übergebe in meinem Code für "_id" nämlich bisher immer Werte von 0 - x (for-Schleife ab "int i = 0") und die anderen SQlite-Methoden die ich verwende klappen so auch alle.
 
Generierst Du die IDs selbst oder ist es eine automatische Inkrementierung? Wenn automatisch, dann fangen die immer bei höher 0 an. Also bei 1.

Wenn Du dich selbst drum kümmerst, die ID zu vergeben, kann da auch 0 stehen.
 
"_id" ist mein primary key und wird automatisch inkrementiert.
Demnach müssten die IDs ja bei 0 anfangen...
Allerdings bekomme ich, wenn ich in meiner for-Schleife i = 0 habe und die ID = i abfrage, einen Gutschein aus meiner Datenbank zurück. Also scheint _id = 0 auch zu existieren. Ganz komisch
 
Code:
// generate and add Items to ListView
        for [COLOR=Red]([B]int i = 0[/B][/COLOR]; i < voucherList.size(); i++) {
            [COLOR=Red][B]Log.e("Test 1", "i = " + i);[/B][/COLOR]
            // reset variables (just to be sure...)
            faveStatusOld = 0;
            faveStatusNew = 0;
            // create new ListViewItem
            lvi = new ListViewItem();
            lvi.textViewID = i;
            lvi.onTextViewClickListener = new OnClickListener() {
                @Override
                public void onClick(View v) {
                    int id = (Integer) v.getTag();
                   [COLOR=Red][B] Log.e("Test 2", "id = " + id);[/B][/COLOR]
                    Builder builder = new Builder(MyVouchersActivity.this);
                    builder.setTitle(R.string.voucherDescriptionDialog_title)
                            .setIcon(android.R.drawable.ic_dialog_info)
                            .setMessage(
                                    [COLOR=Red][B]mHelper.getFieldContent[/B][/COLOR](tableName,[B] [COLOR=Red]id[/COLOR][/B],
                                            DatabaseManager.KEY_DESCR))
                            .setPositiveButton(R.string.close, null).show();
                }
            };
Log-Ausgabe:
10-09 04:45:10.583: E/Test 1(2033): i = 0

10-09 04:45:10.603: E/Test 1(2033): i = 1
10-09 04:45:10.613: E/Test 1(2033): i = 2
10-09 04:45:10.633: E/Test 1(2033): i = 3
[...]
10-09 04:45:50.504: E/Test 2(2033): id = 0

Also es funktioniert definitiv mit "0" für _id Werte/Gutscheine auszulesen.
Nur das Schreiben in der Update Methode muss ich immer erst eine "1" addieren, um in der richtigen Zeile zu schreiben.

Und in meiner ListView werden die Gutscheine der Datenbank auch alle angezeigt, und vor allem der erste, der bei _id = 0 ausgelesen wird!

Aber da ich seit 2 Jahren Java-Programmierung in der Uni eh immer derjenige bin der Fehler hat, die niemand erklären kann, habe ich irgendwann aufgehört, diese zu hinterfragen sondern zu akzeptieren, wenn es funktioniert, auch wenn es nicht dürfte :flapper:
 
Das das hier funktioniert, ist schon klar.

Die

Code:
voucherList


ist ja nicht die Tabelle direkt, sondern eine "List". Die fängt bei 0 an.

Die Daten aus der Tabelle lädst Du ja wahrscheinlich irgendwo anders in die Liste.
 
Max1809 schrieb:
Das das hier funktioniert, ist schon klar.

Die

Code:
voucherList
ist ja nicht die Tabelle direkt, sondern eine "List". Die fängt bei 0 an.

Die Daten aus der Tabelle lädst Du ja wahrscheinlich irgendwo anders in die Liste.

Das ist natürlich richtig. Deswegen hatte ich "mHelper.getFieldContent[...]" markiert. Hier der Code der Methode:
Code:
public String getFieldContent(final String tableName, final int rowID,
            final String columnName) {

        SQLiteDatabase db = this.getReadableDatabase();
        String returnString = "";
        // get cursor
        Cursor cursor = db.query(tableName, new String[] { columnName }, null,
                null, null, null, null);

        int columnID = cursor.getColumnIndex(columnName);
        // move cursor to first position
        cursor.moveToFirst();
        // move cursor to requested rowID
        cursor.move(rowID);
        // return String in requested field
        returnString = cursor.getString(columnID);
        return returnString;
    }

Und da wird auch mit id = 0 ein Wert ausgelesen :smile:
 
Zurück
Oben Unten