8 votes

Une table SQLite avec une colonne d'entiers stocke une chaîne de caractères

J'ai trouvé quelque chose de bizarre dans mon application. J'ai créé une table avec une colonne nommée type qui doit stocker des entiers :

db.execSQL("CREATE TABLE " + CellColumns.TABLE + " ("
    + CellColumns._ID + " INTEGER PRIMARY KEY,"
    + CellColumns.TYPE + " INTEGER," // <-- this
    + CellColumns.CELL_ID + " INTEGER,"
    + CellColumns.CITY_ID + " INTEGER,"
    + CellColumns.LOAD + " INTEGER,"
    + CellColumns.ORIENTATION + " INTEGER);");

Lecture :

String type = c.getString(c.getColumnIndex(CellColumns.TYPE));

Mais d'une manière ou d'une autre, je stocke toujours des chaînes de caractères dans cette colonne sans aucun problème (il semble que j'ai oublié que cette colonne était destinée aux entiers). La lecture des chaînes de caractères avec une requête fonctionne également. Ce "type cast" dynamique d'une colonne est-il une caractéristique de sqlite ?

16voto

Habbie Points 1069

De aquí :

La plupart des moteurs de base de données SQL (tous les moteurs de base de données SQL autres que SQLite, pour autant que nous le sachions) utilisent un typage statique et rigide. Avec le typage statique, le type de données d'une valeur est déterminé par son conteneur - la colonne particulière dans laquelle la valeur est stockée.

SQLite utilise un système de type dynamique plus général. Dans SQLite, le type de données d'une valeur est associé à la valeur elle-même, et non à son conteneur. Le système de types dynamiques de SQLite est rétrocompatible avec les systèmes de types statiques plus courants des autres moteurs de base de données, dans le sens où les instructions SQL qui fonctionnent sur des bases de données à typage statique devraient fonctionner de la même manière dans SQLite. Cependant, le typage dynamique de SQLite lui permet de faire des choses qui ne sont pas possibles dans les bases de données traditionnelles typées de manière rigide.

Donc oui, c'est une fonctionnalité de sqlite. Lisez la page entière que j'ai liée, et lisez attentivement :)

0voto

Rubick Points 347

Vous pouvez l'obtenir via c.getInt() , c.getDouble() etc etc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X