2009-03-20 6 views
1

J'ai une base de données sqlite et j'y ajoute de nouveaux mots. Le problème est que je peux les voir ajoutés à une table seulement après le redémarrage de l'application. L'instruction "SELECT" ne "voit" pas les éléments nouvellement ajoutés avant de redémarrer l'application.Base de données SQLite - ne peut pas voir les mises à jour

Pourquoi cela est-il possible? Je crée une sorte de dictionnaire. Voici comment ajouter de nouveaux éléments:

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); 

Et voici mon code de récupération:

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

Comment ajoutez-vous les mots? Comment les cherchez-vous? Montrez-nous la source! –

+0

Je voudrais essayer NSLogging le résultat de chaque appel sqlite3_ unique, pour voir tout est prévu, mais votre code d'ajout semble que cela devrait probablement fonctionner. À quoi ressemble votre source de récupération? –

Répondre

1

Je suppose que vous êtes dans une transaction. Il doit y avoir d'autres appels pendant vos routines d'ouverture et de fermeture qui enveloppent vos appels dans une transaction et ne sont pas affichés dans vos fragments de code.

C'est pourquoi vous ne voyez pas les nouveaux mots tant que l'application ne s'est pas éteinte

1

Il y a votre problème:

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

Ce n'est pas la façon dont vous utilisez SQL. Au lieu de cela, vous devez utiliser SELECT word FROM words; et avancer pour obtenir chaque ligne tant que vous obtenez SQLITE_ROW jusqu'à obtenir SQLITE_DONE. Cela vous obtiendra tous vos mots. Comment allez-vous trouver un mot par ID quand vous ne connaissez pas l'ID des mots nouvellement ajoutés?

+0

Merci, mais je ne suis pas sûr que ce soit mon problème. Je sais que l'identifiant est automatiquement augmenté, donc si j'ai une quantité de lignes dans une table, je peux obtenir n'importe quelle ligne que je veux. Ce n'est pas mon problème. Comment puis-je valider les modifications? –

+0

À moins que le sqlite3_finalize() sur votre ajout ne soit appelé beaucoup plus tard, ils sont déjà validés. Votre problème est un malentendu sur la façon d'extraire des données de SQLite. Comment comptez-vous les mots? Comment mettez-vous à jour combien de mots vous attendez? –

+0

tewha est correct et son explication explique pourquoi vous "voyez" les données lorsque vous redémarrez. Donnez une chance à son explication. – hyuan

Questions connexes