我想将我的iPhone应用程序迁移到新的数据库版本。由于我没有保存某些版本,因此需要检查某些列名称是否存在。
该Stackoverflow条目建议进行选择
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
并解析结果。
这是常见的方式吗?备择方案?
我想将我的iPhone应用程序迁移到新的数据库版本。由于我没有保存某些版本,因此需要检查某些列名称是否存在。
该Stackoverflow条目建议进行选择
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
并解析结果。
这是常见的方式吗?备择方案?
Answers:
PRAGMA table_info(table_name);
将为您提供所有列名称的列表。
create temporary table TmpCols (cid integer, name text, type text, nn bit, dflt_value, pk bit); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout
db.rawQuery("PRAGMA table_info(" + tablename + ")", null);
如果您有sqlite数据库,请使用sqlite3命令行程序和以下命令:
列出数据库中的所有表:
.tables
显示给定的架构tablename
:
.schema tablename
PRAGMA table_info(table_name);
如果你这样做
.headers ON
您将获得理想的结果。
.sqliterc
文件。
PRAGMA
方法和.schema
方法对我都不起作用。但是,这一工作很好。
只为像我这样的超级菜鸟想知道人们的意思或含义
PRAGMA table_info('table_name')
您希望将其用作您的prepare语句,如下所示。这样做会选择一个看起来像这样的表,但其中会填充与该表有关的值。
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
}
}
如果您希望查询的输出包括列名并正确地对齐为列,请在以下命令中使用以下命令sqlite3
:
.headers on
.mode column
您将得到如下输出:
sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id foo bar
---------- ---------- ----------
1 val1 val2
2 val3 val4
获取此处未提及的列名列表的另一种方法是从编译指示函数中进行选择:
SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name
tbl_name
rootpage
sql
您可以通过运行以下命令检查某个列是否存在:
SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1
如果不想解析来自sqlite_master或pragma table_info的select sql的结果,则使用此方法。
参考:
我知道这是一个旧线程,但是最近我需要使用它,并找到了一种整洁的方式:
SELECT c.name FROM pragma_table_info('your_table_name') c;
where t.name = 'table';
为了获取列信息,您可以使用以下代码段:
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;
}
-(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;
}
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));
});
}
我知道为时已晚,但这对其他人有帮助。
要查找表的列名,您应该执行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));
}
这将打印结果集的所有列名称。
.schema table_name
这将列出数据库中表的列名。
希望这会有所帮助!!!
也许您只想在控制台上打印表头。这是我的代码:(对于每个表)
// ------------------ 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 ---------------------
SQLite.swift
,请参阅这个问题和答案的列名的简单列表或这一个迁移的问题。