Je souhaite migrer mon application iPhone vers une nouvelle version de la base de données. Étant donné que je n'ai pas de version enregistrée, je dois vérifier si certains noms de colonnes existent.
Cette entrée Stackoverflow suggère de faire la sélection
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
et analyser le résultat.
Est-ce la façon habituelle? Des alternatives?
PRAGMA table_info(table_name);
vous obtiendrez une liste de tous les noms de colonnes.
Si vous avez la base de données sqlite, utilisez le programme de ligne de commande sqlite3 et ces commandes:
Pour lister toutes les tables de la base de données:
.tables
Pour afficher le schéma pour une tablename
donnée:
.schema tablename
Si tu fais
.headers ON
vous obtiendrez le résultat souhaité.
Juste pour les super noobs comme moi se demandant comment ou ce que les gens voulaient dire par
PRAGMA table_info('table_name')
Vous souhaitez utiliser cela comme déclaration de préparation, comme indiqué ci-dessous. Cela sélectionne une table qui ressemble à ceci, sauf que les valeurs correspondant à votre table sont remplies.
cid name type notnull dflt_value pk
---------- ---------- ---------- ---------- ---------- ----------
0 id integer 99 1
1 name 0 0
Où id et name sont les noms réels de vos colonnes. Donc, pour obtenir cette valeur, vous devez sélectionner le nom de la colonne en utilisant:
//returns the name
sqlite3_column_text(stmt, 1);
//returns the type
sqlite3_column_text(stmt, 2);
Ce qui retournera le nom de la colonne de la ligne en cours. Pour les attraper tous ou trouver celui que vous voulez, vous devez parcourir toutes les lignes. Le moyen le plus simple de le faire serait de la manière suivante.
//where rc is an int variable if wondering :/
rc = sqlite3_prepare_v2(dbPointer, "pragma table_info ('your table name goes here')", -1, &stmt, NULL);
if (rc==SQLITE_OK)
{
//will continue to go down the rows (columns in your table) till there are no more
while(sqlite3_step(stmt) == SQLITE_ROW)
{
sprintf(colName, "%s", sqlite3_column_text(stmt, 1));
//do something with colName because it contains the column's name
}
}
vous pouvez utiliser l'instruction Like si vous recherchez une colonne en particulier
ex:
SELECT * FROM sqlite_master where sql like('%LAST%')
Si vous voulez que la sortie de vos requêtes inclue des noms de colonnes et soit correctement alignée en tant que colonnes, utilisez ces commandes dans sqlite3
:
.headers on
.mode column
Vous obtiendrez une sortie comme:
sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id foo bar
---------- ---------- ----------
1 val1 val2
2 val3 val4
Lorsque vous exécutez le sqlite3
cli, en tapant:
sqlite3 -header
donnera également le résultat souhaité
//JUST little bit modified the answer of giuseppe which returns array of table columns
+(NSMutableArray*)tableInfo:(NSString *)table{
sqlite3_stmt *sqlStatement;
NSMutableArray *result = [NSMutableArray array];
const char *sql = [[NSString stringWithFormat:@"PRAGMA table_info('%@')",table] UTF8String];
if(sqlite3_prepare(md.database, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
{
NSLog(@"Problem with prepare statement tableInfo %@",
[NSString stringWithUTF8String:(const char *)sqlite3_errmsg(md.database)]);
}
while (sqlite3_step(sqlStatement)==SQLITE_ROW)
{
[result addObject:
[NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];
}
return result;
}
Pour obtenir les informations sur la colonne, vous pouvez utiliser l'extrait suivant:
String sql = "select * from "+oTablename+" LIMIT 0";
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
ResultSetMetaData mrs = rs.getMetaData();
for(int i = 1; i <= mrs.getColumnCount(); i++)
{
Object row[] = new Object[3];
row[0] = mrs.getColumnLabel(i);
row[1] = mrs.getColumnTypeName(i);
row[2] = mrs.getPrecision(i);
}
Je sais que c'est trop tard mais cela aidera les autres.
Pour trouver le nom de colonne de la table, vous devez exécuter select * from tbl_name
et vous obtiendrez le résultat en sqlite3_stmt *
. et vérifiez l'itération de la colonne sur le total de la colonne extraite. S'il vous plaît se référer code suivant pour le même.
// sqlite3_stmt *statement ;
int totalColumn = sqlite3_column_count(statement);
for (int iterator = 0; iterator<totalColumn; iterator++) {
NSLog(@"%s", sqlite3_column_name(statement, iterator));
}
Ceci imprimera tous les noms de colonne du jeu de résultats.
.schema dans la console sqlite lorsque vous êtes dans la table .__
sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
-(NSMutableDictionary*)tableInfo:(NSString *)table
{
sqlite3_stmt *sqlStatement;
NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
const char *sql = [[NSString stringWithFormat:@"pragma table_info('%s')",[table UTF8String]] UTF8String];
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
{
NSLog(@"Problem with prepare statement tableInfo %@",[NSString stringWithUTF8String:(const char *)sqlite3_errmsg(db)]);
}
while (sqlite3_step(sqlStatement)==SQLITE_ROW)
{
[result setObject:@"" forKey:[NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];
}
return result;
}
function getDetails(){
var data = [];
dBase.executeSql("PRAGMA table_info('table_name') ", [], function(rsp){
if(rsp.rows.length > 0){
for(var i=0; i<rsp.rows.length; i++){
var o = {
name: rsp.rows.item(i).name,
type: rsp.rows.item(i).type
}
data.Push(o);
}
}
alert(rsp.rows.item(0).name);
},function(error){
alert(JSON.stringify(error));
});
}
Pour obtenir une liste de colonnes, vous pouvez simplement utiliser:
.schema tablename
Une autre façon d’obtenir une liste de noms de colonnes non mentionnés ici consiste à sélectionner une fonction pragma:
SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name
tbl_name
rootpage
sql
Vous pouvez vérifier si une certaine colonne existe en lançant:
SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1
C'est ce que vous utilisez si vous ne voulez pas analyser le résultat de select SQL à partir de sqlite_master ou de pragma table_info.
Référence:
Vous voulez peut-être simplement imprimer les en-têtes de table sur la console. Ceci est mon code: (pour chaque table)
// ------------------ show header ----------------
char sqlite_stmt_showHeader[1000];
snprintf(sqlite_stmt_showHeader, 1000, "%s%s", "SELECT * FROM ", TABLE_NAME_STRING UTF8String]);
sqlite3_stmt* statement_showHeader;
sqlite3_prepare_v2(DATABASE, sqlite_stmt_showHeader, -1, &statement_showHeader, NULL);
int headerColumnSize = sqlite3_column_count(statement_showHeader);
NSString* headerRow = @"|";
for (int j = 0; j < headerColumnSize; j++) {
NSString* headerColumnContent = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_name(statement_showHeader, j)];
headerRow = [[NSString alloc] initWithFormat:@"%@ %@ |", headerRow, headerColumnContent];
}
NSLog(@"%@", headerRow);
sqlite3_finalize(statement_showHeader);
// ---------------- show header end ---------------------