web-dev-qa-db-fra.com

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

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?

296
luebken
PRAGMA table_info(table_name);

vous obtiendrez une liste de tous les noms de colonnes.

500
nevan king

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
172
Truls Unstad

Si tu fais

.headers ON

vous obtiendrez le résultat souhaité.

128
Roland Orre

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
    }
}
102
Birdbuster

vous pouvez utiliser l'instruction Like si vous recherchez une colonne en particulier

ex:

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

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
8
Owen Pauling

Lorsque vous exécutez le sqlite3 cli, en tapant:

sqlite3 -header

donnera également le résultat souhaité

8
Sam Houston
//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;
}
6
Dattatray Deokar

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);
}
6
Devolus

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.

4
Rohit Kale

.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)
3
Kevin Hu
-(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;
  }
3
giuseppe
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));
});             
}
2
Om Shankar

Pour obtenir une liste de colonnes, vous pouvez simplement utiliser:

.schema tablename
1
Aditya Joardar

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:

https://www.sqlite.org/pragma.html#pragfunc

1
user1461607

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 ---------------------
0
Neo Wang