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

224

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

Эта запись https://stackoverflow.com/questions/685206/how-to-get-a-list-of-column-names предлагает сделать выбор

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

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

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

Теги:
sqlite3
iphone

10 ответов

428
PRAGMA table_info(table_name);

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

  • 14
    но вы не можете выбрать из этой таблицы. Это просто раздражает. Я пытаюсь что-то вроде этого ... но это не работает create temporary table TmpCols (cid integer, name text, type text, nn bit, dflt_value, pk bit); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout
  • 0
    Просто чтобы поместить это в термины кода для SQLiteDatabase на Android, напишите db.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Показать ещё 6 комментариев
144

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

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

.tables

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

.schema tablename
  • 6
    Хотя выходные данные не так «читабельны» (возможно), это легче запомнить, чем PRAGMA table_info(table_name);
  • 8
    @NickTomlin К сожалению, этот метод требует наличия программы командной строки sqlite3, так как точечные команды не являются допустимыми SQL.
78

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

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

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

.headers ON

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

  • 17
    Должен быть принятый ответ.
  • 3
    Как выровнять заголовки с содержанием ниже?
Показать ещё 4 комментария
6
//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

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

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);
}
  • 0
    это работает с представлениями, объединениями и т. д. - но что это за оболочка БД?
  • 0
    Это просто JDBC. Нет обертки.
6

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

Пример:

SELECT * FROM sqlite_master where sql like('%LAST%')
3
-(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;
  }
2

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

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

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

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

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

  • 0
    Спасибо, это сработало отлично!
  • 0
    Это не работает, если таблица пуста ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню