Ответ 1
PRAGMA table_info(table_name);
предоставит вам список всех имен столбцов.
Я хочу перенести приложение iPhone в новую версию базы данных. Поскольку у меня нет сохраненной версии, мне нужно проверить, существуют ли имена столбцов.
Эта запись qaru.site/info/28210/... предлагает сделать выбор
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 и имя являются фактическими именами ваших столбцов. Чтобы получить это значение, вам нужно выбрать имя столбца, используя:
//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 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
также даст желаемый результат
Чтобы получить информацию о столбцах, вы можете использовать следующий фрагмент:
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;
}
Чтобы получить список столбцов, вы можете просто использовать:
.schema tablename
Я знаю это слишком поздно, но это поможет другим.
Чтобы найти имя столбца таблицы, вы должны выполнить 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 в консоли sqlite, когда вы находитесь внутри таблицы для меня это выглядит так...
sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
Альтернативный способ получить список имен столбцов, не упомянутых здесь, это выбрать из прагмы функцию:
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
Это то, что вы используете, если не хотите анализировать результат выбора sql из sqlite_master или pragma table_info.
Ссылка:
-(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 t.tbl_name, c.name col_name
from
sqlite_master t,
pragma_table_info(t.tbl_name) c
where t.type = 'table';
Может быть, вы просто хотите напечатать заголовки таблицы на консоли. Это мой код: (для каждой таблицы)
// ------------------ 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 ---------------------