我想将我的iPhone应用程序迁移到新的数据库版本。由于我没有保存一些版本,我需要检查是否存在某些列名。如何获取sqlite3/iPhone上的列名称列表?
这Stackoverflow entry建议做选择
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
和分析结果。
这是常用的方法吗?备择方案?
我想将我的iPhone应用程序迁移到新的数据库版本。由于我没有保存一些版本,我需要检查是否存在某些列名。如何获取sqlite3/iPhone上的列名称列表?
这Stackoverflow entry建议做选择
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
和分析结果。
这是常用的方法吗?备择方案?
PRAGMA table_info(table_name);
会给你一个所有列名的列表。
但您无法从该表中选择。这只是简单的烦人。我正在尝试这样的东西...但它不工作`创建临时表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
只需将它置于Android上SQLiteDatabase的代码条件中,编写`db.rawQuery(“PRAGMA table_info(”+ tablename +“)”,null);` – Noumenon 2013-06-08 14:14:33
This在View的情况下也可以工作。 PRAGMA table_info(View_Name); 这将列出视图的所有列 – coding 2013-07-26 03:00:11
如果你有SQLite数据库,使用sqlite3的命令行程序和这些命令:
要列出所有数据库中的表:
.tables
要显示给定tablename
模式:
.schema tablename
您可以使用Like语句,如果你正在寻找任何特定列
例如:
SELECT * FROM sqlite_master where sql like('%LAST%')
-(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;
}
为了让你可以使用下面的代码片段列信息:
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;
}
只为超级菜鸟和我一样想知道别人怎么还是什么意思通过
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
}
}
我知道这太晚了,但这会帮助其他人。
要查找表的列名称,应执行“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));
}
这将打印结果集的所有列名称。
在当你有你的表 它看起来是这样的,我里面的SQLite控制台.schema ...
sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
如果你
.headers ON
你会得到期望的结果。
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));
});
}
当您运行sqlite3
CLI,打字:
sqlite3 -header
也将得到期望的结果
对于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