iphone
  • sqlite
  • 2010-11-23 5 views 0 likes 
    0

    à ce code, je suis en train d'obtenir instruction SQL CREATE de sqlite_master pour une table spécifique:changement étrange * omble chevalier sqlite3_step (déclaration)

    [SQLStatement setString: @ "SELECT name, sql DE sqlite_master OU type = 'table' ET nom = '"];
    [SQLStatement appendString: tableName]; [SQLStatement appendString: @ "'"];

    int dbrc; 
    const char *charSQLStatement = [SQLStatement UTF8String]; 
    sqlite3_stmt *statement = nil; 
    dbrc = sqlite3_prepare_v2 (dbHandleSQLite, charSQLStatement, -1, &statement, NULL); 
    const char *nameColumn,*sqlColumn; 
    dbrc = sqlite3_step (statement); 
    NSString *tempString; 
    do { 
        nameColumn = sqlite3_column_text(statement,0); 
        sqlColumn = sqlite3_column_text(statement,1); 
        NSLog(@"%s",nameColumn); 
        NSLog(@"%s",sqlColumn); 
        tempString = [NSString stringWithCString:sqlColumn encoding:NSASCIIStringEncoding]; 
    } while (sqlite3_step(statement) == SQLITE_ROW); 
    sqlite3_finalize (statement); 
    
    NSLog(@"%s",nameColumn); 
    NSLog(@"%s",sqlColumn); 
    

    La boucle do-while est exécutée une seule fois. Vous pouvez voir, que j'ai fait une petite contournement pour obtenir cette valeur travaillée et assignée à tempString. Raison est que si sqlite3_step (instruction) est à nouveau exécuté, nameColumn et sqlColumn changent leurs valeurs bien qu'ils ne soient pas appelés à nouveau ?? !! NameColumn reçoit le nom de la table et sqlColumn reçoit l'instruction "CREATE TABLE ...", ce qui est OK.

    Mais lorsque le programme arrive à expiration, nameColumn passe à "index" et sqlColumn à quelque chose de non compréhensible, bien que loop ne soit pas répété.

    Comment cela est-il possible? Qu'est-ce que je fais mal?

    Répondre

    1

    Vous ne faites rien de mal. sqlite réutilise les tampons. Si vous voulez garder quelque chose que vous en obtenez, faites-en une copie: la valeur d'un pointeur n'est garantie que jusqu'au prochain sqlite3_step ou sqlite3_finalize.

    Donc, votre solution de contournement est de savoir comment vous êtes censé gérer cela.

    De SQLite docs:

    Les pointeurs retournés sont valides jusqu'à ce qu'une conversion de type se produit comme décrit ci-dessus, ou jusqu'à ce que sqlite3_step() ou sqlite3_reset() ou sqlite3_finalize() est appelé. L'espace mémoire utilisé pour stocker les chaînes et les objets BLOB est automatiquement libéré. Ne pas passer les pointeurs retournés sqlite3_column_blob(), sqlite3_column_text(), etc. dans sqlite3_free().
    +0

    Merci! Cela le rend clair. – mbpro

    +1

    Vous devriez probablement accepter la réponse pour fermer la question. :) –

    Questions connexes