2009-06-03 39 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 

也将得到期望的结果