2009-02-28 6 views
2

J'ai une colonne de chaîne sqlite affectée à une chaîne. Je dois m'assurer qu'il n'est pas nul avant d'assigner. Je fais ceci:Vérification correcte de la colonne de texte nil sqlite

char *isNil = sqlite3_column_text(selectstmt, 2); 
if(isNil != nil){ 
    myName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];} 

qui donne l'avertissement:

avertissement: initialisation défausse qualifiés de pointeur type de cible

Quelle est la bonne façon de le faire?

Répondre

7

Vous recevez l'avertissement car vous ignorez la const. L'API est définie:

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); 

Vous assignons le retour à un char *, de sorte que vous êtes tomber const. C'est pourquoi vous obtenez l'avertissement. Vous devriez respecter la const.

const unsigned char *isNil = ... 

Je ne suis pas vraiment un grand gars c objectif, mais je pense que stylistiquement, il est pratique courante pour comparer les types primative contre NULL plutôt que nul. De même, il n'est pas nécessaire d'appeler column_text deux fois.

const char *columnText = (const char *)sqlite3_column_text(selectstmt, 2); 
if(columnText != NULL) 
{ 
    myName = [NSString stringWithUTF8String: columnText ]; 
} 

Vous pouvez voir ci-dessus J'ai transtypé le pointeur const non signé en un pointeur char const. Vous devriez vous assurer que vous savez quand vous jetez un avertissement que c'est la bonne chose à faire. Dans ce cas, il est prudent de lancer un char signé. En général, ne jamais rejeter const, car quiconque a fait cette API pourrait faire quelque chose qui vous oblige à traiter les données comme const.

+0

Merci. Cela donne un nouvel avertissement sur l'affectation de * columnText: Les cibles de pointeur dans l'initialisation diffèrent en signe. – 4thSpace

+0

J'ai ajouté la distribution pour arrêter l'avertissement. –

Questions connexes