2012-04-02 1 views
12

Ich möchte eine Tabelle von SQLite in meiner App ändern.Check Wenn Spalte bereits existiert und wenn nicht Alter Tabelle in sqlite

Jetzt möchte ich überprüfen, ob diese Spalte bereits in meiner Tabelle existiert oder nicht?

Daher wenn ich nicht existiere, möchte ich diese Spalte mit Alter Tabelle Syntex hinzufügen.

derzeit verwende ich.

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

Antwort

30

Verwenden Sie die folgende Funktion, um zu überprüfen, ob die Spalte existiert. Nicht praktisch überprüft, so dass Sie die Syntax überprüfen müssen. Konzept ist wie, wenn Sie in der Lage sind, eine vorbereitete Aussage als Spalte zu erstellen, andernfalls nicht.

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

Froh, dass es für Sie gearbeitet. –

+0

@JanakNirmal arbeitete auch für mich. – Vats

9

PRAGMA table_info(table-name);

Diese Pragma verwendet Liste der Spalten in der Tabelle zu erhalten.

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

Vergessen Sie nicht, die Aussage zu finalisieren! –