我想将我的iPhone应用程序迁移到新的数据库版本.由于我没有保存某些版本,我需要检查是否存在某些列名.
此Stackoverflow条目建议执行select
SELECT sql FROM sqlite_master WHERE tbl_name = 'table_name' AND type = 'table'
并解析结果.
这是常见的方式吗?备择方案?
PRAGMA table_info(table_name);
将为您提供所有列名称的列表.
如果您有sqlite数据库,请使用sqlite3命令行程序和以下命令:
列出数据库中的所有表:
.tables
要显示给定的架构tablename
:
.schema tablename
如果你这样做
.headers ON
你会得到理想的结果.
只为像我这样的超级新人想知道人们的意思或方式
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 } }
如果希望查询的输出包含列名并正确对齐为列,请在sqlite3
以下位置使用以下命令:
.headers on .mode column
您将获得如下输出:
sqlite> .headers on sqlite> .mode column sqlite> select * from mytable; id foo bar ---------- ---------- ---------- 1 val1 val2 2 val3 val4
如果要搜索任何特定列,可以使用Like语句
例如:
SELECT * FROM sqlite_master where sql like('%LAST%')
当您运行sqlite3
cli时,键入:
sqlite3 -header
也会给出理想的结果
要获取列列表,您可以简单地使用:
.schema tablename
要获取列信息,您可以使用以下代码段:
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; }
获取此处未提及的列名列表的另一种方法是从编译指示函数中进行选择:
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的结果,则使用此方法。
参考:
https://www.sqlite.org/pragma.html#pragfunc