2012-04-02 14 views
12

Voglio modificare una tabella di sqlite nella mia app.Verifica se la colonna esiste già e se non altera la tabella in sqlite

ora, voglio controllare se questa colonna esiste già nel mio tavolo o no?

quindi se non esiste voglio aggiungere quella colonna con alter tabella syntex.

attualmente sto usando.

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

risposta

30

Uso seguente funzione per controllare se esiste colonna. Non controllato praticamente in modo da poter controllare la sintassi. Il concetto è come se tu sia in grado di creare una dichiarazione preparata che la colonna non esiste altrimenti.

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

Swift 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

Glad ha funzionato per voi. –

+0

@JanakNirmal ha funzionato anche per me. – Vats

9

PRAGMA table_info(table-name);

Questo Pragma è usato per ottenere l'elenco delle colonne della tabella.

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

Non dimenticare di finalizzare la dichiarazione! –

Problemi correlati