¿Cómo obtener una lista de nombres de columna en sqlite3 / iPhone?

Quiero migrar mi aplicación de iPhone a una nueva versión de base de datos. Como no tengo una versión guardada, necesito verificar si existen ciertos nombres de columna.

Esta entrada Stackoverflow sugiere hacer la selección

SELECT sql FROM sqlite_master WHERE tbl_name = 'table_name' AND type = 'table' 

y analizar el resultado.

¿Es esa la manera común? ¿Alternativas?

 PRAGMA table_info(table_name); 

obtendrá una lista de todos los nombres de las columnas.

Si tiene la base de datos sqlite, use el progtwig de línea de comandos sqlite3 y estos comandos:

Para enumerar todas las tablas en la base de datos:

 .tables 

Para mostrar el esquema de un nombre de tablename dado:

 .schema tablename 

Si lo haces

 .headers ON 

obtendrá el resultado deseado.

Solo para súper noobs como yo preguntándome cómo o a qué se refería la gente

 PRAGMA table_info('table_name') 

Desea utilizarlo como su statement de preparación, como se muestra a continuación. Al hacerlo, selecciona una tabla que se ve así, excepto que está poblada con valores pertenecientes a su tabla.

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

Donde ID y nombre son los nombres reales de sus columnas. Para obtener ese valor, debe seleccionar el nombre de columna usando:

 //returns the name sqlite3_column_text(stmt, 1); //returns the type sqlite3_column_text(stmt, 2); 

Que devolverá el nombre de la columna de la fila actual. Para tomarlos todos o encontrar el que desea, necesita iterar a través de todas las filas. La forma más simple de hacerlo sería de la siguiente manera.

 //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 } } 

puede usar la statement Like si está buscando una columna en particular

ex:

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

Para obtener la información de la columna, puede usar el siguiente fragmento de código:

 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); } 
 //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; } 

Cuando ejecuta sqlite3 cli, escribiendo:

 sqlite3 -header 

también dará el resultado deseado

 -(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; } 

.schema en la consola sqlite cuando tienes dentro de la mesa se ve algo como esto para mí …

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

Sé que es demasiado tarde, pero esto ayudará a otros.

Para encontrar el nombre de columna de la tabla, debe ejecutar select * from tbl_name y obtendrá el resultado en sqlite3_stmt * . y verifique que la columna itere sobre la columna total recuperada. Por favor, consulte el siguiente código para el mismo.

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

Esto imprimirá todos los nombres de columna del conjunto de resultados.

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

Tal vez solo quiera imprimir los encabezados de la tabla en la consola. Este es mi código: (para cada tabla)

  // ------------------ 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 ---------------------