2009-06-03 156 views
250

我想將我的iPhone應用程序遷移到新的數據庫版本。由於我沒有保存一些版本,我需要檢查是否存在某些列名。如何獲取sqlite3/iPhone上的列名稱列表?

Stackoverflow entry建議做選擇

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

和分析結果。

這是常用的方法嗎?備擇方案?

+0

對於SQLite.swift`的`具體情況,請參閱[這個問題和答案](http://stackoverflow.com/questions/36784596/how-to-get-a-list-of-column-names-with-sqlite-swift)列名稱的簡單列表或[this one](http ://stackoverflow.com/a/29866725/3681880)用於遷移問題。 – Suragch 2016-04-22 04:10:07

回答

431
PRAGMA table_info(table_name); 

會給你一個所有列名的列表。

+12

但您無法從該表中選擇。這只是簡單的煩人。我正在嘗試這樣的東西...但它不工作`創建臨時表TmpCols(cid整數,名稱文本,文本類型,nn位,dflt_value,pk位); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout` – Jason 2012-01-05 07:03:45

+0

只需將它置於Android上SQLiteDatabase的代碼條件中,編寫`db.rawQuery(「PRAGMA table_info(」+ tablename +「)」,null);` – Noumenon 2013-06-08 14:14:33

+4

This在View的情況下也可以工作。 PRAGMA table_info(View_Name); 這將列出視圖的所有列 – coding 2013-07-26 03:00:11

152

如果你有SQLite數據庫,使用sqlite3的命令行程序和這些命令:

要列出所有數據庫中的表:

.tables 

要顯示給定tablename模式:

.schema tablename 
7

您可以使用Like語句,如果你正在尋找任何特定列

例如:

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

爲了讓你可以使用下面的代碼片段列信息:

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

只爲超級菜鳥和我一樣想知道別人怎麼還是什麼意思通過

PRAGMA table_info('table_name') 

您想使用如下所示的準備語句。這樣做會選擇一個看起來像這樣的表格,除了填充與表格有關的值。

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

其中id和name是您的列的實際名稱。因此,爲了得到你需要通過選擇列名稱值:

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

將返回當前行的列的名稱。要全部抓住它們或找到你想要的,你需要遍歷所有行。最簡單的方式就是以下面的方式。

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

我知道這太晚了,但這會幫助其他人。

要查找表的列名稱,應執行「select * from tbl_name」,您將在「sqlite3_stmt *」中獲得結果。並檢查列遍歷總提取列。請參考以下代碼。

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

這將打印結果集的所有列名稱。

3

在當你有你的表 它看起來是這樣的,我裏面的SQLite控制檯.schema ...

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

如果你

.headers ON 

你會得到期望的結果。

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

當您運行sqlite3 CLI,打字:

sqlite3 -header 

也將得到期望的結果