Как получить список имен столбцов на sqlite3 / iPhone? - PullRequest
309 голосов
/ 04 июня 2009

Я хочу перенести приложение для iPhone на новую версию базы данных. Поскольку у меня нет сохраненной версии, мне нужно проверить, существуют ли определенные имена столбцов.

Эта запись Stackoverflow предлагает сделать выбор

SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

и проанализируем результат.

Это обычный способ? Альтернативы?

Ответы [ 16 ]

519 голосов
/ 04 июня 2009
PRAGMA table_info(table_name);

выдаст вам список всех имен столбцов.

180 голосов
/ 12 июня 2009

Если у вас есть база данных sqlite, используйте программу командной строки sqlite3 и эти команды:

Для просмотра всех таблиц в базе данных:

.tables

Чтобы показать схему для данного tablename:

.schema tablename
149 голосов
/ 07 декабря 2016

Если вы делаете

.headers ON

вы получите желаемый результат.

105 голосов
/ 17 декабря 2013

Просто для таких супер нубов, как я, интересно, как или что люди имеют в виду под

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
    }
}
26 голосов
/ 31 октября 2018

Если вы хотите, чтобы вывод ваших запросов включал имена столбцов и был правильно выровнен как столбцы, используйте эти команды в sqlite3:

.headers on
.mode column

Вы получите вывод как:

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4
10 голосов
/ 03 мая 2012

вы можете использовать лайк, если вы ищете какой-либо конкретный столбец

например:

SELECT * FROM sqlite_master where sql like('%LAST%')
9 голосов
/ 13 февраля 2018

Когда вы запускаете sqlite3 cli, набираете:

sqlite3 -header

также даст желаемый результат

6 голосов
/ 28 сентября 2013
//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;
}
6 голосов
/ 24 июня 2013

Для получения информации о столбце вы можете использовать следующий фрагмент:

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);
}
4 голосов
/ 01 ноября 2016

.schema в консоли sqlite, когда вы находитесь внутри стола для меня это выглядит примерно так ...

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...