2009-06-27 4 views
3

Was sagt die Anweisung "in SQLite einfügen" im Erfolgsfall?Gibt "Einfügen" in SQLite SQLITE_OK oder SQLITE_DONE zurück?

ich immer geglaubt, dass es SQLITE_DONE sein sollte, aber vor kurzem in meinem Logs fand ich die folgende Zeichenfolge aus:

sqlite3_step error: 'not an error' 

Und hier ist der Code, der die genannte Zeichenfolge protokolliert:

prepareStatement(addTranslationStmt2, "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)"); 
if (!addTranslationStmt2) return -2; 

sqlite3_bind_int(addTranslationStmt2, 1, word_id); 
sqlite3_bind_int(addTranslationStmt2, 2, translation_id); 

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE) 
{ 
    NSLog(@"sqlite3_step error: '%s'", sqlite3_errmsg(database)); 
    sqlite3_reset(addTranslationStmt2); 
    return -1; 
} 

sqlite3_reset(addTranslationStmt2); 

Ich frage mich, warum es in den meisten Fällen funktioniert. Sollte ich SQLITE_DONE in meinem Code zu SQLITE_OK ändern?

Danke.

+1

Wenn Sie den Fehlercode gedruckt haben, was haben Sie gesehen? –

+0

Überprüfen Sie http://code.google.com/p/database-adt/ – Macarse

Antwort

3

In solchen Fällen schaue ich mir gerne Codebeispiele an. Hier sind einige gute:

http://sqlite.phxsoftware.com/forums/p/76/6659.aspx

Die SQLite Result Codes Reference Listen SQLITE_OK als ein erfolgreiches Ergebnis anzeigt. Es ist auch der erste Fehlercode, der einen Fehlercode von 0 hat, was ihn zum kanonischen Ergebnis macht (d. H. Das Ergebnis, das ich bei einer erfolgreichen Operation erwarten würde).

Sie sollten einen Breakpoint oder eine print-Anweisung in Ihren Code einfügen, um herauszufinden, ob sie wirklich Null liefert, und Ihre Daten überprüfen, um sicherzustellen, dass Sie das erwartete Ergebnis erhalten. Wenn das alles auscheckt, würde ich Ihre Bedingung ändern, um nach SQLITE_OK zu suchen.

Die Einzelheiten des Verhaltens der sqlite3_step() Schnittstelle hängen davon ab, ob die Anweisung vorbereitet wurde die neuere „v2“ Schnittstelle sqlite3_prepare_v2() und sqlite3_prepare16_v2() oder die ältere Legacy-Schnittstelle sqlite3_prepare() und sqlite3_prepare16().

In der Legacy-Schnittstelle, der Wert Rückkehr wird entweder SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR oder SQLITE_MISUSE sein. Mit der "v2" -Schnittstelle können auch alle anderen Ergebniscodes oder erweiterten Ergebniscodes zurückgegeben werden.

1

Der Wechsel von "Debug" -Konfiguration zu "Release" löste das Problem für mich.