it-swarm.com.de

Wie bekomme ich eine Liste mit Spaltennamen auf sqlite3/iPhone?

Ich möchte meine iPhone-App auf eine neue Datenbankversion migrieren. Da ich keine Version gespeichert habe, muss ich überprüfen, ob bestimmte Spaltennamen vorhanden sind.

Dieser Stackoverflow-Eintrag schlägt vor, die Auswahl zu treffen

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

und das Ergebnis analysieren. 

Ist das der übliche Weg? Alternativen?

296
luebken
PRAGMA table_info(table_name);

erhalten Sie eine Liste aller Spaltennamen.

500
nevan king

Wenn Sie über die SQLite-Datenbank verfügen, verwenden Sie das Befehlszeilenprogramm sqlite3 und die folgenden Befehle:

So listen Sie alle Tabellen in der Datenbank auf:

.tables

So zeigen Sie das Schema für eine bestimmte tablename an:

.schema tablename
172
Truls Unstad

Wenn Sie tun

.headers ON

sie erhalten das gewünschte Ergebnis.

128
Roland Orre

Nur für Super-Noobs wie mich, die sich fragen, wie oder was Leute damit gemeint haben 

PRAGMA table_info('table_name') 

Verwenden Sie das als Ihre vorbereitende Anweisung, wie unten gezeigt. Dadurch wird eine Tabelle ausgewählt, die wie folgt aussieht, außer dass Werte für Ihre Tabelle angegeben werden.

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

Dabei sind ID und Name die tatsächlichen Namen Ihrer Spalten. Um diesen Wert zu erhalten, müssen Sie den Spaltennamen folgendermaßen auswählen:

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

Welcher gibt den Namen der Spalte der aktuellen Zeile zurück. Um sie alle zu packen oder den gewünschten zu finden, müssen Sie alle Zeilen durchlaufen. Am einfachsten wäre dies in der folgenden Weise.

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

sie können die Like-Anweisung verwenden, wenn Sie nach einer bestimmten Spalte suchen

ex:

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

Wenn Sie möchten, dass die Ausgabe Ihrer Abfragen Spaltennamen enthält und korrekt als Spalten ausgerichtet ist, verwenden Sie diese Befehle in sqlite3:

.headers on
.mode column

Sie erhalten folgende Ausgabe:

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4
8
Owen Pauling

Wenn Sie sqlite3 cli ausführen, geben Sie Folgendes ein:

sqlite3 -header

gibt auch das gewünschte Ergebnis

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

Um die Spalteninformationen zu erhalten, können Sie das folgende Snippet verwenden:

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

Ich weiß, es ist zu spät, aber das wird anderen helfen.

Um den Spaltennamen der Tabelle zu finden, müssen Sie select * from tbl_name ausführen. Das Ergebnis wird in sqlite3_stmt * angezeigt. und überprüfen Sie die Spalte durch die insgesamt abgerufene Spalte. Bitte beziehen Sie sich auf den folgenden Code.

// sqlite3_stmt *statement ;
int totalColumn = sqlite3_column_count(statement);
for (int iterator = 0; iterator<totalColumn; iterator++) {
   NSLog(@"%s", sqlite3_column_name(statement, iterator));
}

Dadurch werden alle Spaltennamen der Ergebnismenge gedruckt.

4
Rohit Kale

Eine alternative Möglichkeit, eine Liste der hier nicht erwähnten Spaltennamen zu erhalten, besteht darin, eine Pragma-Funktion auszuwählen:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

Sie können überprüfen, ob eine bestimmte Spalte vorhanden ist, indem Sie Folgendes ausführen:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

Dies verwenden Sie, wenn Sie das Ergebnis von select sql aus sqlite_master oder pragma table_info nicht analysieren möchten.

Referenz:

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

3
user1461607

.schema in der sqlite-Konsole, wenn Sie sich in der Tabelle befinden Es sieht für mich so aus ... 

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

Um eine Liste der Spalten zu erhalten, können Sie einfach Folgendes verwenden:

.schema tablename
1
Aditya Joardar

Vielleicht möchten Sie nur die Tabellenköpfe auf der Konsole ausdrucken. Dies ist mein Code: (für jede Tabelle)

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