2012-04-02 10 views
12

में ऑल्टर टेबल नहीं है, तो मैं अपने ऐप में स्क्लाइट की एक तालिका को बदलना चाहता हूं।जांचें कि क्या कॉलम पहले से मौजूद है और यदि स्क्लाइट

अब, मैं यह जांचना चाहता हूं कि वह कॉलम मेरी तालिका में पहले से मौजूद है या नहीं?

इसलिए यदि मौजूद नहीं है तो मैं उस तालिका को तालिका syntex के साथ जोड़ना चाहता हूं।

वर्तमान में मैं उपयोग कर रहा हूं।

-(void) alterDB{ 
    sqlite3_stmt *statement; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME]; 

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 

     NSString *updateSQL = [NSString stringWithFormat: @"ALTER TABLE diagramInfo ADD COLUMN testColumn VARCHAR"]; 
     const char *update_stmt = [updateSQL UTF8String]; 
     sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL); 

     if(sqlite3_step(statement)==SQLITE_DONE) 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DB altered" message:@"Success" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  
      [alert show]; 
      [alert release]; 
      alert=nil; 

     } 
     else 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"DB Updation" message:@"DB not Altered" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
      alert=nil; 
     } 
     // Release the compiled statement from memory 
     sqlite3_finalize(statement);  
     sqlite3_close(database); 
    } 
} 

उत्तर

30

कॉलम मौजूद है या नहीं, यह जांचने के लिए निम्न फ़ंक्शन का उपयोग करें। व्यावहारिक रूप से चेक नहीं किया गया है इसलिए आपको वाक्यविन्यास जांचना पड़ सकता है। अवधारणा ऐसा है जैसे आप कॉलम की तुलना में तैयार कथन तैयार करने में सक्षम हैं अन्यथा नहीं।

-(BOOL)checkColumnExists 
{ 
    BOOL columnExists = NO; 

    sqlite3_stmt *selectStmt; 

    const char *sqlStatement = "select yourcolumnname from yourtable"; 
    if(sqlite3_prepare_v2(yourDbHandle, sqlStatement, -1, &selectStmt, NULL) == SQLITE_OK) 
     columnExists = YES; 

    return columnExists; 
} 

स्विफ्ट 3.2:

private func tableHasColumn(db: OpaquePointer, tableName: String, columnName: String) -> Bool { 

     var retVal = false 

     var tableColumnsQueryStatement: OpaquePointer? = nil 
     if sqlite3_prepare_v2(db, "PRAGMA table_info(\(tableName));", 
          -1, 
          &tableColumnsQueryStatement, 
          nil) == SQLITE_OK { 

      while (sqlite3_step(tableColumnsQueryStatement) == SQLITE_ROW) { 

       let queryResultCol1 = sqlite3_column_text(tableColumnsQueryStatement, 1) 
       let currentColumnName = String(cString: queryResultCol1!) 

       if currentColumnName == columnName { 
        retVal = true 
        break 
       } 
      } 
     } 

     return retVal 
} 
+1

खुशी है कि यह आप के लिए काम किया। –

+0

@ जनक निर्मल ने भी मेरे लिए काम किया। – Vats

9

PRAGMA table_info(table-name);

यह Pragma अपनी तालिका में स्तंभों की सूची प्राप्त करने के लिए प्रयोग किया जाता है।

For more details, visit here

- (BOOL)checkForField 
{ 
    NSString *desiredColumn = @"tblName"; 
    const char *sql = "PRAGMA table_info(tblTest)"; 
    sqlite3_stmt *stmt; 

    if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) 
    { 
     return NO; 
    } 

    while(sqlite3_step(stmt) == SQLITE_ROW) 
    { 

     NSString *fieldName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)]; 
     if([desiredColumn isEqualToString:fieldName]) 
      return YES; 
    } 

    return NO; 
} 
+1

कथन को अंतिम रूप देने के लिए मत भूलना! –

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