2009-12-08 9 views
1

Cela devrait être une question facile que je figure, mais je n'avais pas trouvé cette réponse d'ailleurs où, étonnamment, je l'affiche ici.Sqlite API accès booléen

J'ai hérité d'une base de données axée sur SQLite qui contient des colonnes booléennes en elle, déclarée comme ceci:

CREATE TABLE example (
    ex_col BOOLEAN NOT NULL DEFAULT 0, 
); 

Ce tableau tente d'accéder via l'API sqlite3 C appelle sqlite_column_* fonctions, maintenant, étant donné que SQLite ne supporte pas réellement les types booléens, quel est le comportement attendu ici?

Il semble sqlite_column_int() revenir toujours 0 ou faux, je suppose que cela est parce que toutes les colonnes de SQLite sont vraiment colonnes de texte ...

Et quelle est la bonne façon de maintenir ce - aller chercher sous forme de texte, puis chaîne comparer à vrai? Je ne veux vraiment pas modifier la base de données et tous les autres codes qui s'y rattachent.

Répondre

1

Une façon évidente serait de le "déclarer" comme une colonne entière, puis lorsque vous faites INSERT ou UPDATE, vous lui passez 1 (True) ou 0 (False). De cette façon, vous maintenez la compatibilité avec le langage C. Vous n'avez même pas besoin de le déclarer comme int, assurez-vous de toujours y insérer des entiers et tout ira bien.

Vous avez mentionné qu'il s'agit d'une base de données héritée, comment ont-ils fait avant? Si elles sont stockées sous forme de texte, vous devrez peut-être appeler sqlite_column_text(), puis rechercher une chaîne pour les chaînes littérales "true" ou "false".

+0

Ils n'avaient pas à récupérer la colonne booléenne dans le code C précédemment, donc ce n'était pas fait. Ce qu'ils avaient, c'était beaucoup de #defines pour sql stmts (ins, upd, etc) et tout un tas de vues et de triggers ... en gros, la valeur n'est jamais directement lue ou insérée. : -/ – Petriborg

+0

Mais sûrement quelque part la valeur est utilisée? Les déclencheurs utilisent-ils la valeur de la colonne? Que diriez-vous des instructions '# defined'? Si ce n'est jamais utilisé, alors pourquoi est-ce là? ;-) –

+0

Oui utilisé, comme cet exemple UPDATE "#define SQL" SET ex_col = 'true'; "' et ce stmt est appelé normalement. Le code sql fait la même chose, donc je suppose que je dois juste faire tout en chaîne (yum) ou changer le type de colonne à Int plutôt, pas de belles solutions ici !! – Petriborg

1

J'ai un point de données qui pourrait vous donner un indice.

Le SQLite Administrator tool convertit des booléens aux chaînes "true" et "false".