2009-06-03 14 views
250

मैं अपने आईफोन ऐप को एक नए डेटाबेस संस्करण में माइग्रेट करना चाहता हूं। चूंकि मेरे पास कुछ संस्करण सहेजा नहीं गया है, इसलिए मुझे यह जांचना होगा कि कुछ कॉलम नाम मौजूद हैं या नहीं।sqlite3/iPhone पर कॉलम नामों की सूची कैसे प्राप्त करें?

यह Stackoverflow entry

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

कर पता चलता है और परिणाम को पार्स।

क्या यह आम तरीका है? वैकल्पिक?

+0

'SQLite.swift' के विशेष मामले के लिए, [इस सवाल-जवाब को देखने के ] (कॉलम नामों की एक साधारण सूची के लिए http://stackoverflow.com/questions/36784596/how-to-get-a-list-of-column-names-with-sqlite-swift) कॉलम नामों की एक साधारण सूची के लिए या [यह एक] (http माइग्रेशन मुद्दों के लिए //stackoverflow.com/a/29866725/3681880)। – Suragch

उत्तर

431
PRAGMA table_info(table_name); 

आपको सभी कॉलम नामों की एक सूची प्राप्त करेगा।

+12

लेकिन आप उस तालिका से चयन नहीं कर सकते हैं। यह सिर्फ सादा कष्टप्रद है। मैं इस तरह कुछ कोशिश कर रहा हूं ... लेकिन यह काम नहीं करता है 'अस्थायी तालिका TmpCols (सिड पूर्णांक, नाम पाठ, प्रकार पाठ, एनएन बिट, dflt_value, पीके बिट) बनाएँ; । मोड सम्मिलित करें TmpCols । आउटपुट कॉल PRAGMA TABLE_INFO ('yourtable'); .read कॉलम .mode सीएसवी .output stdout' – Jason

+0

बस SQLiteDatabase Android पर के लिए कोड संदर्भ में इस डाल करने के लिए, लिखने 'db.rawQuery (" PRAGMA table_info ("+ tablename +") ", नल),' – Noumenon

+4

यह दृश्य के मामले में भी काम करेगा। PRAGMA table_info (View_Name); यह एक दृश्य – coding

152

आप SQLite डेटाबेस है, तो sqlite3 कमांड लाइन कार्यक्रम और इन आदेशों का उपयोग:

डेटाबेस में सभी तालिकाओं को सूचीबद्ध करने के:

.tables 

एक दिया tablename के लिए स्कीमा दिखाने के लिए:

.schema tablename 
+5

हालांकि आउटपुट "पठनीय" (शायद) के रूप में नहीं है 'pragma table_info (table_name) की तुलना में यह याद रखना आसान है; ' –

+8

@NickTomlin दुर्भाग्य से, इस विधि में sqlite3 कमांड लाइन प्रोग्राम होने की आवश्यकता है, क्योंकि डॉट कमांड मान्य SQL नहीं हैं । – Michael

7

आप बयान की तरह उपयोग कर सकते हैं अगर आप किसी भी विशेष स्तंभ

के लिए खोज रहे हैं

पूर्व:

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

यह बस जेडीबीसी है। कोई रैपर नहीं – Devolus

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; 
} 
88

बस मेरे जैसे सुपर noobs के लिए सोच रहा है कि कैसे या क्या लोगों का मतलब

PRAGMA table_info('table_name') 

आप नीचे दिखाए गए अनुसार अपने तैयार कथन के रूप में उपयोग का उपयोग करना चाहते हैं। ऐसा करने से ऐसी तालिका दिखाई देती है जो इस तरह दिखती है, सिवाय इसके कि आपकी तालिका से संबंधित मूल्यों के साथ पॉप्युलेट किया गया हो।

cid   name  type  notnull  dflt_value pk   
---------- ---------- ---------- ---------- ---------- ---------- 
0   id   integer  99      1   
1   name     0      0 

जहां आईडी और नाम आपके कॉलम के वास्तविक नाम हैं।

//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 
    } 
} 
1

मुझे पता है कि यह बहुत देर हो चुकी है लेकिन यह अन्य की मदद करेगी।

तालिका के कॉलम नाम को खोजने के लिए, आपको "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

यह तालिका खाली होने पर _not_ काम करता है ... – arkascha

3

SQLite सांत्वना जब आप आप तालिका यह मेरे लिए कुछ इस तरह दिखता अंदर कर रहे है में .schema ...

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

यदि आप करते हैं

.headers ON 

आप मिल जाएगा वांछित परिणाम।

+2

स्वीकार्य उत्तर होना चाहिए। –

+0

नीचे सामग्री के साथ शीर्षलेख को संरेखित कैसे करें? – Sunnyday

+0

और हमेशा इसे चालू करने के लिए, इसे [अपनी '.sqliterc' फ़ाइल] में रखें (https://stackoverflow.com/a/5924315/1028230)। – ruffin

1
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)); 
});    
} 
0

जब आप sqlite3 CLI चलाने के लिए, में टाइप:

sqlite3 -header 

भी वांछित परिणाम दे देंगे

संबंधित मुद्दे