iPhoneアプリを新しいデータベースバージョンに移行したい。一部のバージョンを保存していないため、特定の列名が存在するかどうかを確認する必要があります。
このStackoverflowエントリは、選択を行うことを提案します
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
結果を解析します。
それは一般的な方法ですか?代替案?
iPhoneアプリを新しいデータベースバージョンに移行したい。一部のバージョンを保存していないため、特定の列名が存在するかどうかを確認する必要があります。
このStackoverflowエントリは、選択を行うことを提案します
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);
もしあなたがそうするなら
.headers ON
希望する結果が得られます。
.sqliterc
ファイルに入れます。
PRAGMA
方法と.schema
方法の両方が私にとってうまくいかなかった。しかし、これは問題なく動作します。
私のような超初心者のためだけに
PRAGMA table_info('table_name')
以下に示すように、それをprepareステートメントとして使用します。これにより、テーブルに関連する値が入力されていることを除いて、次のようなテーブルが選択されます。
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
}
}
クエリの出力に列名を含め、列として正しく配置する場合は、次のコマンドをで使用しますsqlite3
。
.headers on
.mode column
次のような出力が得られます。
sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id foo bar
---------- ---------- ----------
1 val1 val2
2 val3 val4
ここに記載されていない列名のリストを取得する別の方法は、プラグマ関数から選択することです。
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
これは、sqlite_masterまたはpragma table_infoからのselect sqlの結果を解析したくない場合に使用します。
参照:
特定の列を検索する場合は、Likeステートメントを使用できます
例:
SELECT * FROM sqlite_master where sql like('%LAST%')
私はそれが古いスレッドであることを知っていますが、最近私は同じものが必要で、きちんとした方法を見つけました:
SELECT c.name FROM pragma_table_info('your_table_name') c;
where t.name = 'table';
列情報を取得するには、次のスニペットを使用できます。
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);
}
//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;
}
-(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;
}
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));
});
}
手遅れだと知っていますが、これは他の人を助けるでしょう。
テーブルの列名を見つけるには、実行する必要が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));
}
これにより、結果セットのすべての列名が出力されます。
たぶん、コンソールのテーブルヘッダーを印刷したいだけかもしれません。これは私のコードです:(各テーブル用)
// ------------------ 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 ---------------------
SQLite.swift
についてはこの質問と回答を参照してください。移行の問題については、このリストを参照してください。