Я хочу перенести приложение 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'
и проанализировать результат.
Это общий путь? Альтернативы?
PRAGMA table_info(table_name);
предоставит вам список всех имен столбцов.
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
db.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Если у вас есть база данных sqlite, используйте программу командной строки sqlite3 и следующие команды:
Чтобы перечислить все таблицы в базе данных:
.tables
Чтобы показать схему для данного tablename
:
.schema tablename
PRAGMA table_info(table_name);
Просто для супер нубов вроде меня интересно, как и что люди подразумевали под
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
}
}
Если вы делаете
.headers ON
вы получите желаемый результат.
//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;
}
Чтобы получить информацию о столбцах, вы можете использовать следующий фрагмент:
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);
}
вы можете использовать инструкцию Like, если вы ищете какой-либо конкретный столбец
Пример:
SELECT * FROM sqlite_master where sql like('%LAST%')
-(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;
}
.schema в консоли sqlite, когда вы находитесь внутри таблицы для меня это выглядит так...
sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)
Я знаю, что это слишком поздно, но это поможет другим.
Чтобы найти имя столбца таблицы, вы должны выполнить "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));
}
Это приведет к печати всех имен столбцов набора результатов.
SQLite.swift
, посмотрите этот вопрос и ответ для простого списка имен столбцов или этот для проблем миграции.