sqlite3 / iPhone에서 열 이름 목록을 얻는 방법은 무엇입니까?
iPhone 앱을 새로운 데이터베이스 버전으로 마이그레이션하고 싶습니다. 일부 버전이 저장되지 않았으므로 특정 열 이름이 있는지 확인해야합니다.
이 Stackoverflow 항목 은 선택을 제안합니다.
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'
결과를 구문 분석하십시오.
이것이 일반적인 방법입니까? 대안?
PRAGMA table_info(table_name);
모든 열 이름 목록을 얻을 수 있습니다.
sqlite 데이터베이스가있는 경우 sqlite3 명령 행 프로그램 및 다음 명령을 사용하십시오.
데이터베이스의 모든 테이블을 나열하려면 다음을 수행하십시오.
.tables
지정된 스키마를 표시하려면 다음을 수행하십시오 tablename
.
.schema tablename
당신이 할 경우
.headers ON
원하는 결과를 얻을 수 있습니다.
사람들이 어떻게 또는 무엇을 의미하는지 궁금해하는 저 같은 멍청한 놈들을 위해서
PRAGMA table_info('table_name')
아래 표시된대로이를 준비 명령문으로 사용하려고합니다. 이렇게하면 테이블과 관련된 값으로 채워지는 것을 제외하고 이와 같은 테이블이 선택됩니다.
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
특정 열을 검색하는 경우 Like 문을 사용할 수 있습니다
전의:
SELECT * FROM sqlite_master where sql like('%LAST%')
sqlite3
cli 를 실행할 때 다음을 입력하십시오.
sqlite3 -header
또한 원하는 결과를 줄 것이다
열 정보를 얻으려면 다음 스 니펫을 사용할 수 있습니다.
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;
}
열 목록을 얻으려면 다음을 사용하면됩니다.
.schema tablename
당신이 테이블 안에있을 때 sqlite 콘솔의 .schema 그것은 나에게 이런 식으로 보입니다 ...
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));
}
결과 집합의 모든 열 이름이 인쇄됩니다.
여기에 언급되지 않은 열 이름 목록을 얻는 다른 방법은 pragma 함수에서 선택하는 것입니다.
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의 결과를 구문 분석하지 않으려는 경우 사용합니다.
참고:
https://www.sqlite.org/pragma.html#pragfunc
-(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 t.tbl_name, c.name col_name
from
sqlite_master t,
pragma_table_info(t.tbl_name) c
where t.type = 'table';
콘솔에서 테이블 헤더를 인쇄하고 싶을 수도 있습니다. 이것은 내 코드입니다 : (각 테이블마다)
// ------------------ 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 ---------------------
참고 URL : https://stackoverflow.com/questions/947215/how-to-get-a-list-of-column-names-on-sqlite3-iphone
'Programming' 카테고리의 다른 글
포트 80은 SYSTEM (PID 4)에서 사용 중입니까? (0) | 2020.03.06 |
---|---|
CSS의 반응 형 글꼴 크기 (0) | 2020.03.06 |
-lPods에 대한 라이브러리를 찾을 수 없습니다 (0) | 2020.03.06 |
Windows의 자산 index.android.bundle에서 스크립트를로드 할 수 없습니다 (0) | 2020.03.06 |
무결성 및 crossorigin 속성은 무엇입니까? (0) | 2020.03.06 |