Comment obtenir une liste de noms de colonnes sur sqlite3 / iPhone?

Je souhaite migrer mon application iPhone vers une nouvelle version de firebase database. Comme je n’ai pas de version enregistrée, je dois vérifier si certains noms de colonne 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 parsingr le résultat.

Est-ce la voie commune? Des alternatives?

 PRAGMA table_info(table_name); 

vous obtiendrez une liste de tous les noms de colonne.

Si vous avez la firebase database sqlite, utilisez le programme de ligne de commande sqlite3 et ces commandes:

Pour répertorier toutes les tables de la firebase database:

 .tables 

Pour afficher le schéma pour un tablename donné:

 .schema tablename 

Si tu fais

 .headers ON 

vous obtiendrez le résultat souhaité.

Juste pour les super noobs comme moi, se demandant comment et quelles personnes

 PRAGMA table_info('table_name') 

Vous souhaitez utiliser cela comme instruction de préparation, comme indiqué ci-dessous. Cela permet de sélectionner une table qui ressemble à ceci, sauf qu’elle contient des valeurs appartenant à votre table.

 cid name type notnull dflt_value pk ---------- ---------- ---------- ---------- ---------- ---------- 0 id integer 99 1 1 name 0 0 

Où id et nom 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); 

Qui retournera le nom de la colonne de la ligne en cours. Pour les saisir tous ou trouver celui que vous voulez, vous devez parcourir toutes les lignes. La manière la plus simple de le faire serait de la manière ci-dessous.

 //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 particulière

ex:

 SELECT * FROM sqlite_master where sql like('%LAST%') 

Pour obtenir les informations sur la colonne, vous pouvez utiliser l’extrait suivant:

 Ssortingng 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); } 
 //JUST little bit modified the answer of giuseppe which returns array of table columns +(NSMutableArray*)tableInfo:(NSSsortingng *)table{ sqlite3_stmt *sqlStatement; NSMutableArray *result = [NSMutableArray array]; const char *sql = [[NSSsortingng ssortingngWithFormat:@"PRAGMA table_info('%@')",table] UTF8Ssortingng]; if(sqlite3_prepare(md.database, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { NSLog(@"Problem with prepare statement tableInfo %@", [NSSsortingng ssortingngWithUTF8Ssortingng:(const char *)sqlite3_errmsg(md.database)]); } while (sqlite3_step(sqlStatement)==SQLITE_ROW) { [result addObject: [NSSsortingng ssortingngWithUTF8Ssortingng:(char*)sqlite3_column_text(sqlStatement, 1)]]; } return result; } 

Lorsque vous exécutez le cli de sqlite3 , tapez:

 sqlite3 -header 

donnera également le résultat souhaité

 -(NSMutableDictionary*)tableInfo:(NSSsortingng *)table { sqlite3_stmt *sqlStatement; NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; const char *sql = [[NSSsortingng ssortingngWithFormat:@"pragma table_info('%s')",[table UTF8Ssortingng]] UTF8Ssortingng]; if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { NSLog(@"Problem with prepare statement tableInfo %@",[NSSsortingng ssortingngWithUTF8Ssortingng:(const char *)sqlite3_errmsg(db)]); } while (sqlite3_step(sqlStatement)==SQLITE_ROW) { [result setObject:@"" forKey:[NSSsortingng ssortingngWithUTF8Ssortingng:(char*)sqlite3_column_text(sqlStatement, 1)]]; } return result; } 

.schema dans la console sqlite lorsque vous êtes dans la table, cela ressemble à ceci pour moi …

 sqlite>.schema CREATE TABLE players( id integer primary key, Name varchar(255), Number INT, Team varchar(255) 

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 dans sqlite3_stmt * . et vérifiez l’itération de la colonne sur la colonne extraite totale. Veuillez vous référer au code suivant pour la même chose.

 // sqlite3_stmt *statement ; int totalColumn = sqlite3_column_count(statement); for (int iterator = 0; iterator 

Cela imprimera tous les noms de colonne du jeu de résultats.

 function getDetails(){ var data = []; dBase.executeSql("PRAGMA table_info('table_name') ", [], function(rsp){ if(rsp.rows.length > 0){ for(var i=0; i 

Vous souhaitez peut-être simplement imprimer les en-têtes de table sur la console. Ceci est mon code: (pour chaque tableau)

  // ------------------ show header ---------------- char sqlite_stmt_showHeader[1000]; snprintf(sqlite_stmt_showHeader, 1000, "%s%s", "SELECT * FROM ", TABLE_NAME_STRING UTF8Ssortingng]); sqlite3_stmt* statement_showHeader; sqlite3_prepare_v2(DATABASE, sqlite_stmt_showHeader, -1, &statement_showHeader, NULL); int headerColumnSize = sqlite3_column_count(statement_showHeader); NSSsortingng* 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 ---------------------