[OFFEN] SQLITE insert gibt negative id zurück

  • 9 Antworten
  • Letztes Antwortdatum
H

hs1

Fortgeschrittenes Mitglied
15
Hallo Leute,

ich habe in meiner App das Problem, dass manchmal nicht die richtige ID beim Einfügen von Datensätzen zurückgegeben wird. Beim letzten Fall kam folgende ID heraus: -14073748835558

Code:
long insertId = database.insert(ZahlungTableHelper.TABLE_NAME, null, values);

Die Tabelle hat eine ID-Spalte die wie folgt definiert ist: INTEGER PRIMARY KEY AUTOINCREMENT

Das Query schlägt nicht fehlt, es kommt keine Exception, der Datensatz wird auch in die Datenbank eingefügt (mit positiver und korrekter ID). Woran könnte es liegen, das SQLLITE anstatt der richtigen ID eine negative (siehe oben) zurück gibt?

Verwendet wird Android 2.3.4 (Kundenvorgabe).

Viele Grüße

hs1
 
Steht in der Datenbank die negative ID drin oder meinst du beim Auslesen im Programm?
D.h. hast du in deine DB geguckt und die negative ID gesehen? Kann ja eventuell sein, dass du falsch ausliest.

Bei der ID-Spalte nicht vergessen, dass sie _id heißen sollte.

Zeige mal bitte mehr von deinem Code :)
 
Welchen Wert hat deine id? Ich würde mal vermuten, dass die Zahl größer als 2.147.483.647 ist. :)

Erklärung: Integer ist 32Bit lange Zahl, Davon die Hälfte, und dann kommt man auf 2.147.483.647.

Benutze einfach kleinere Zahlen.
 
markus.tullius schrieb:
Welchen Wert hat deine id? Ich würde mal vermuten, dass die Zahl größer als 2.147.483.647 ist. :)

Erklärung: Integer ist 32Bit lange Zahl, Davon die Hälfte, und dann kommt man auf 2.147.483.647.

Benutze einfach kleinere Zahlen.
Bis max. 64 Bit werden da verwendet in SQLite. Wieviel im Endeffekt verwendet wird hängt vom Wert ab. SQLite 3 und SQLite 4 unterscheiden sich auch etwas: SQLite 4 benutzt die variablen 64 Bit für Ganzzahlen und Kommazahlen. SQLite 3 nur für Ganzzahlen und feste Größen für Kommazahlen (Datentyp REAL)

Dazu kommt noch dass er da AUTOINCREMENT benutzt. Also müssen da schon sehr sehr viele Werte eingetragen worden sein.
 
Nicht unbedingt. AUTOINCREMENT heißt nicht nicht, dass man den key nicht selber vergibt.
Und ob long oder oder int, das Problem ist das gleiche.

Einfach mal ausprobieren:
long l = Long.MAX_VALUE; // 9223372036854775807
l++; // l ist negativ -9223372036854775808
 
markus.tullius schrieb:
Nicht unbedingt. AUTOINCREMENT heißt nicht nicht, dass man den key nicht selber vergibt.
Und ob long oder oder int, das Problem ist das gleiche.

Einfach mal ausprobieren:
long l = Long.MAX_VALUE; // 9223372036854775807
l++; // l ist negativ -9223372036854775808
Ich glaube bei negativen Zahlen fällt ein bit weg für das Vorzeichen? Bin mir nciht sicher aber mal schauen ob der OP sich nochmal meldet mit paar mehr Infos
 
Das ganze nennt man "Arithmetischer Überlauf"

Beispiel:

1111 1111 = 255
+ 0000 0001 = 1
--------------------
(1) 0000 0000 = 0 (weil das 9 Bit nicht existiert, also einfach ignoriert wird.
 
Zuletzt bearbeitet:
Ich glaube wir reden aneinander vorbei :D Ich denke jeder Programmierer sollte das kennen auch ohne Informatik Studium

Ob hier ein Overflow stattgefunden hat oder nicht kann man erst sicher sagen wenn der OP sich mal wieder meldet
 
Sorry Leute, ich war ein paar Tage im Kurzurlaub und konnte deshalb nicht antworten :)

Die ID liegt bei ~20000. Der Datensatz wird korrekt eingefügt. Die Insert-Funktion gibt aber anstatt die ID diese hohen negativen Zahlen zurück. Es kommt auch keine Exception.

So sieht der Code (verkürzt) aus:

Code:
long insertId = database.insert(ZahlungTableHelper.TABLE_NAME, null, values);

Code:
 public static final String COLUMN_ID = "_id";
    public static final String COLUMN_KONTO = "konto";
    public static final String COLUMN_VORGANG_KEY = "vorgang_key";
    public static final String COLUMN_BUCHUNG_ID = "buchung_id";
    public static final String COLUMN_UMSATZ_KEY = "umsatz_key";
    public static final String COLUMN_UMSATZNUMMER = "umsatznummer";
    public static final String COLUMN_UMSATZ = "umsatz";
    public static final String COLUMN_ANGELEGT_VON = "angelegt_von";
    public static final String COLUMN_ANGELEGT_AM = "angelegt_am";
    public static final String COLUMN_GLOBAL_UNIQUE_ID_UMSATZ = "global_unique_id_umsatz";
    public static final String SQL_CREATE_TABLE =
            "CREATE TABLE "
                    + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
                    + COLUMN_KONTO + " TEXT, "
                    + COLUMN_VORGANG_KEY + " INTEGER, "
                    + COLUMN_BUCHUNG_ID + " INTEGER, "
                    + COLUMN_UMSATZ_KEY + " INTEGER, "
                    + COLUMN_UMSATZNUMMER + " TEXT, "
                    + COLUMN_ZAHLUNGSART + " TEXT, "
                    + COLUMN_UMSATZ + " REAL, "
                    + COLUMN_ANGELEGT_VON + " INTEGER, "
                    + COLUMN_ANGELEGT_AM  + " INTEGER, "
                    + COLUMN_GLOBAL_UNIQUE_ID_UMSATZ  + " TEXT "
                    + ");";
    public static final String SQL_CREATE_INDICES =
            "CREATE INDEX IF NOT EXISTS idx1buchung_zahlungen ON buchung_zahlungen (" + COLUMN_KONTO + "," + COLUMN_BUCHUNG_ID + ");" +
            "CREATE INDEX IF NOT EXISTS idx2buchung_zahlungen ON buchung_zahlungen (" + COLUMN_UMSATZ_KEY + "," + COLUMN_KONTO + ");" +
   
}
    public ContentValues getContentValues(ZahlungModel pZahlung){
        ContentValues retVal = new ContentValues();
        retVal.put(ZahlungTableHelper.COLUMN_KONTO, pZahlung.getKonto());
        retVal.put(ZahlungTableHelper.COLUMN_UMSATZ_KEY, pZahlung.getUmsatzKey());
        retVal.put(ZahlungTableHelper.COLUMN_UMSATZ, pZahlung.getZahlungsbetrag());
        retVal.put(ZahlungTableHelper.COLUMN_VORGANG_KEY, pZahlung.getVorgangKey());
        retVal.put(ZahlungTableHelper.COLUMN_BUCHUNG_ID, pZahlung.getBuchungId());
        retVal.put(ZahlungTableHelper.COLUMN_UMSATZNUMMER, pZahlung.getUmatzNummer());
        retVal.put(ZahlungTableHelper.COLUMN_ANGELEGT_AM, Converter.persistDate(pZahlung.getAngelegtAm()));
        retVal.put(ZahlungTableHelper.COLUMN_ANGELEGT_VON, pZahlung.getAngelegtVon());
        retVal.put(ZahlungTableHelper.COLUMN_GLOBAL_UNIQUE_ID_UMSATZ , pZahlung.getGlobalUniqueIdUmsatz());
        return retVal;
    }
 
Hallo hs1,

das ist zu wenig Code, und wahrscheinlich der falsche. Hier sehe ich erst mal nichts, was deinen Fehler verursacht haben könnte.
 
Zurück
Oben Unten