2009-06-03 12 views
250

Ich möchte meine iPhone App auf eine neue Datenbankversion migrieren. Da ich keine Version gespeichert habe, muss ich prüfen, ob bestimmte Spaltennamen existieren.Wie bekomme ich eine Liste von Spaltennamen auf sqlite3/iPhone?

Diese Stackoverflow entry schlägt vor, die Auswahl

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

und analysieren das Ergebnis zu tun.

Ist das der übliche Weg? Alternativen?

+0

Für den speziellen Fall von 'SQLite.swift' finden Sie unter [diese Frage und Antwort ] (http://stackoverflow.com/questions/36784596/how-to-get-a-list-of-column-names-with-sqlite-swift) für eine einfache Liste von Spaltennamen oder [diese] (http : //stackoverflow.com/a/29866725/3681880) für Migrationsprobleme. – Suragch

Antwort

431
PRAGMA table_info(table_name); 

erhalten Sie eine Liste aller Spaltennamen.

+12

, aber Sie können nicht aus dieser Tabelle auswählen. Es ist einfach nur nervig. Ich versuche so etwas ... aber es funktioniert nicht 'create temporäre Tabelle TmpCols (CID Integer, Name Text, Text eingeben, nn Bit, dflt_value, pk Bit); .mode einfügen TmpCols .output cols PRAGMA TABLE_INFO ('yuertable'); .lesen cols .mode csv .output stdout' – Jason

+0

Nur um dies in dem Code Begriffe für SQLiteDatabase auf Android, schreibt 'db.rawQuery ("PRAGMA table_info (" + name + ")", null);' – Noumenon

+4

Diese funktioniert auch im Falle von View. PRAGMA table_info (Ansichtsname); Dies wird alle Spalten einer Ansicht auflisten – coding

152

Wenn Sie die SQLite-Datenbank haben, verwenden Sie das sqlite3 Kommandozeilenprogramm und diese Befehle:

Um alle Tabellen in der Datenbank auflisten:

.tables 

das Schema für ein bestimmtes tablename anzuzeigen:

.schema tablename 
+5

Obwohl die Ausgabe nicht so "lesbar" ist (vielleicht), ist dies viel einfacher zu merken als 'PRAGMA table_info (table_name);' –

+8

@NickTomlin Leider erfordert diese Methode das sqlite3-Befehlszeilenprogramm, da Punktbefehle nicht gültig SQL sind . – Michael

7

Sie Wie Anweisung verwenden können, wenn Sie für eine bestimmte Spalte

suchen

ex:

SELECT * FROM sqlite_master where sql like('%LAST%') 
3
-(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; 
    } 
6

Um die Spalteninformationen erhalten Sie folgenden Code-Schnipsel verwenden können:

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); 
} 
+0

dies funktioniert mit Ansichten, Joins usw. - aber was db Wrapper ist das? –

+0

Es ist einfach jdbc. Kein Wrapper. – Devolus

6
//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; 
} 
88

Just for Super noobs wie mich fragen, wie oder was bedeutete Menschen von

PRAGMA table_info('table_name') 

Sie möchten das als Ihre prepare-Anweisung verwenden, wie unten gezeigt. Wenn Sie dies tun, wird eine Tabelle ausgewählt, die so aussieht, außer dass sie mit Werten gefüllt ist, die zu Ihrer Tabelle gehören.

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

Wo ID und Name die tatsächlichen Namen Ihrer Spalten sind. So bekommen Sie diesen Wert benötigen Sie Spaltennamen wählen, indem Sie:

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

, die die aktuelle Zeile der Spalte Name wird zurückkehren. Um sie alle zu finden oder die gewünschte zu finden, müssen Sie alle Zeilen durchlaufen. Der einfachste Weg wäre die unten beschriebene Vorgehensweise.

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

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

Um den Spaltennamen der Tabelle zu finden, sollten Sie "select * from tbl_name" ausführen und Sie erhalten das Ergebnis in "sqlite3_stmt *". und überprüfen Sie, ob die Spalte über die gesamte abgerufene Spalte iteriert. Bitte beachten Sie folgenden Code für das gleiche.

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

+0

Danke, das hat perfekt funktioniert! –

+0

Dies funktioniert _nicht_ wenn die Tabelle leer ist ... – arkascha

3

.schema in SQLite-Konsole, wenn Sie haben Sie in der Tabelle sind es so etwas für mich sieht ...

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

Wenn Sie

.headers ON 

tun, werden Sie bekommen das gewünschte Ergebnis.

+2

Sollte die akzeptierte Antwort sein. –

+0

Wie richtet man Header mit Inhalt unten aus? – Sunnyday

+0

Und um das immer zu haben, legen Sie es in [Ihre '.sqliterc' Datei] (https://stackoverflow.com/a/5924315/1028230). – ruffin

1
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)); 
});    
} 
0

Wenn Sie die sqlite3 cli laufen, in eingeben:

sqlite3 -header 

wird auch das gewünschte Ergebnis

Verwandte Themen