Как получить список имен столбцов на sqlite3/iPhone?

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

Эта запись qaru.site/info/28210/... предлагает сделать выбор

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

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

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

Ответ 1

PRAGMA table_info(table_name);

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

Ответ 2

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

Чтобы перечислить все таблицы в базе данных:

.tables

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

.schema tablename

Ответ 3

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

.headers ON

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

Ответ 4

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

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
    }
}

Ответ 5

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

.headers on
.mode column

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

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4

Ответ 6

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

Пример:

SELECT * FROM sqlite_master where sql like('%LAST%')

Ответ 7

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

sqlite3 -header

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

Ответ 8

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

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);
}

Ответ 9

//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;
}

Ответ 10

Чтобы получить список столбцов, вы можете просто использовать:

.schema tablename

Ответ 11

Я знаю это слишком поздно, но это поможет другим.

Чтобы найти имя столбца таблицы, вы должны выполнить 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));
}

Это напечатает все имена столбцов набора результатов.

Ответ 12

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

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)

Ответ 13

Альтернативный способ получить список имен столбцов, не упомянутых здесь, это выбрать из прагмы функцию:

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.

Ссылка:

https://www.sqlite.org/pragma.html#pragfunc

Ответ 14

-(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;
  }

Ответ 15

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));
});             
}

Ответ 16

Я знаю, что это старая ветка, но в последнее время я нуждался в ней и нашел изящный способ:

select t.tbl_name, c.name col_name
from 
  sqlite_master t, 
  pragma_table_info(t.tbl_name) c
where t.type = 'table';

Ответ 17

Может быть, вы просто хотите напечатать заголовки таблицы на консоли. Это мой код: (для каждой таблицы)

    // ------------------ 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 ---------------------