我想將我的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