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

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

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

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

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

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

Ответы [ 16 ]

4 голосов
/ 02 мая 2016

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

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

При этом будут напечатаны все имена столбцов набора результатов.

3 голосов
/ 02 марта 2019

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

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

3 голосов
/ 18 апреля 2013
-(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 голосов
/ 24 января 2018
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));
});             
}
1 голос
/ 20 мая 2019

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

.schema tablename
0 голосов
/ 25 апреля 2018

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

    // ------------------ 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 ---------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...