2012-04-02 9 views
12

Chcę zmienić tabelę sqlite w mojej aplikacji.Sprawdź, czy kolumna już istnieje, a jeśli nie, zmień tabelę w sqlite

teraz, chcę sprawdzić, czy ta kolumna już istnieje w mojej tabeli, czy nie?

stąd jeśli nie istnieje, chcę dodać tę kolumnę z modyfikacją tablicy tabeli.

obecnie używam.

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

Odpowiedz

30

Użyj następującej funkcji do sprawdzenia, czy kolumna istnieje. Nie sprawdzone praktycznie, więc możesz sprawdzić składnię. Koncepcja jest taka, że ​​jeśli jesteś w stanie stworzyć przygotowane oświadczenie niż kolumna istnieje, w przeciwnym razie nie.

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

Cieszę się, że pracował dla ciebie. –

+0

@JanakNirmal również pracował dla mnie. – Vats

9

PRAGMA table_info(table-name);

Ten Pragma służy do listy kolumn dostać w tabeli.

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

Nie zapomnij sfinalizować wyciągu! –

Powiązane problemy