2009-03-20 4 views
1

Ich habe eine SQLite-Datenbank und ich füge neue Wörter hinzu. Das Problem ist, dass ich sehe, dass sie erst nach einem Neustart der Anwendung zu einer Tabelle hinzugefügt werden. Die "SELECT" -Anweisung "sieht" neu hinzugefügte Elemente nicht, bevor sie die Anwendung neu startet.SQLite-Datenbank - kann keine Updates sehen

Warum kann das passieren?

Ich erstelle eine Art Wörterbuch. Hier ist, wie ich neue Elemente hinzuzufügen:

const char *sql_query = "INSERT INTO words(word) VALUES(?)"; 
     if(sqlite3_prepare_v2(database, sql_query, -1, &addWordsStmt, NULL) != SQLITE_OK) 
     { 
      return FALSE; 
     } 

sqlite3_bind_text(addWordsStmt, 1, [ word UTF8String], -1, SQLITE_TRANSIENT); 

    if(sqlite3_step(addWordsStmt) != SQLITE_DONE) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 

sqlite3_reset(addWordsStmt); 


sqlite3_finalize(addWordsStmt); 

Und hier ist mein Retrieval-Code:

const char *sql_query = "SELECT word FROM words WHERE id=?"; 

     if(sqlite3_prepare_v2(database, sql_query, -1, &getWordsStmt, NULL) != SQLITE_OK) 
     { 
      return; 
     } 

sqlite3_bind_int(getWordsStmt, 1, wordid); 

    if(sqlite3_step(getWordsStmt) != SQLITE_ROW) 
    { 
     NSLog(@"Error while getting data. '%s'", sqlite3_errmsg(database)); 
     sqlite3_reset(getWordsStmt); 
     return; 
    } 

    NSString *word = [NSString stringWithUTF8String:(char *)sqlite3_column_text(getWordsStmt, 0)]; 

sqlite3_reset(getWordsStmt); 

sqlite3_finalize(getWordsStmt); 
+0

Wie fügen Sie die Wörter? Wie suchst du nach ihnen? Zeigen Sie uns die Quelle! –

+0

Ich würde versuchen NSLogging das Ergebnis jedes einzelnen sqlite3_ Aufrufs, um zu sehen, alles wird erwartet, aber Ihr Add-Code sieht aus wie es sollte wahrscheinlich funktionieren. Wie sieht Ihre Abrufquelle aus? –

Antwort

1

Meine Vermutung ist, dass Sie in einer Transaktion sind. Während Ihrer Open- und Close-Routinen müssen einige andere Aufrufe ausgeführt werden, die Ihre Aufrufe in eine Transaktion einschließen und nicht in Ihren Codefragmenten angezeigt werden.

Deshalb sollten Sie nicht die neuen Wörter sehen, bis Sie Anwendung beendet

1

Es ist Ihr Problem:

const char *sql_query = "SELECT word FROM words WHERE id=?"; 

Dies ist nicht, wie Sie SQL verwenden. Stattdessen sollten Sie SELECT word FROM words; verwenden und schrittweise jede Zeile abrufen, solange Sie SQLITE_ROW erhalten, bis Sie SQLITE_DONE erhalten. Das wird dir alle deine Worte bringen. Wie wirst du ein Wort nach ID finden, wenn du die ID neu hinzugefügter Wörter nicht kennst?

+0

Danke, aber ich bin mir nicht sicher, dass es mein Problem ist. Ich weiß, dass die ID automatisch erhöht wird. Wenn ich also eine bestimmte Anzahl an Zeilen in einer Tabelle habe, kann ich jede beliebige Zeile abrufen. Das ist nicht mein Problem. Wie kann ich Änderungen vornehmen? –

+0

Wenn sqlite3_finalize() in Ihrem Add nicht viel später aufgerufen wird, werden sie bereits festgelegt. Ihr Problem ist ein Missverständnis darüber, wie Sie Daten aus SQLite erhalten. Wie zählen Sie die Wörter? Wie aktualisierst du, wie viele Wörter du erwartest? –

+0

tewha ist korrekt und seine Erklärung beschreibt, warum Sie die Daten beim Neustart "sehen". Gib seiner Erklärung eine Chance. – hyuan