Come ottenere un elenco di nomi di colonne su sqlite3 / iPhone?

Voglio migrare la mia app per iPhone a una nuova versione del database. Dal momento che non ho alcuna versione salvata, devo controllare se esistono alcuni nomi di colonne.

Questa voce StackOverflow suggerisce di eseguire la selezione

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

e analizzare il risultato.

È questo il modo comune? Alternative?

 PRAGMA table_info(table_name); 

otterrà una lista di tutti i nomi delle colonne.

Se si dispone del database sqlite, utilizzare il programma della riga di comando sqlite3 e questi comandi:

Per elencare tutte le tabelle nel database:

 .tables 

Per mostrare lo schema per un dato tablename :

 .schema tablename 

Se fate

 .headers ON 

otterrai il risultato desiderato.

Solo per super noob come me che mi chiedevo come o cosa intendesse la gente

 PRAGMA table_info('table_name') 

Vuoi usarlo come dichiarazione di preparazione come mostrato di seguito. In questo modo seleziona una tabella simile a questa, tranne che è popolata con valori relativi alla tabella.

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

Dove id e nome sono i nomi effettivi delle tue colonne. Quindi per ottenere quel valore è necessario selezionare il nome della colonna usando:

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

Quale restituirà il nome della colonna della riga corrente. Per afferrarli tutti o trovare quello che vuoi, devi scorrere tutte le righe. Il modo più semplice per farlo sarebbe nella maniera seguente.

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

puoi usare l’istruzione Like se stai cercando una particolare colonna

ex:

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

Per ottenere le informazioni sulla colonna puoi utilizzare il seguente frammento:

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

Quando esegui sqlite3 cli, digita:

 sqlite3 -header 

darà anche il risultato desiderato

 -(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 in console sqlite quando hai te che sei dentro al tavolo sembra qualcosa del genere per me …

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

So che è troppo tardi, ma questo aiuterà gli altri.

Per trovare il nome della colonna della tabella, dovresti eseguire select * from tbl_name e otterrai il risultato in sqlite3_stmt * . e controlla la colonna itera sulla colonna totale recuperata. Si prega di fare riferimento al seguente codice per lo stesso.

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

Questo stamperà tutti i nomi delle colonne del set di risultati.

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

Forse vuoi solo stampare le intestazioni della tabella sulla console. Questo è il mio codice: (per ogni tabella)

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