2012-04-02 67 views
12

我想在我的应用程序中更改sqlite表。检查列是否已经存在,如果不是,则在sqlite中更改表

现在,我想检查一下,如果该列已经存在于我的表中或不是?

因此,如果不存在,我想用alter table 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

高兴它为你工作。 – 2012-04-02 08:36:58

+0

@JanakNirmal也为我工作。 – Vats 2015-09-10 07:57:42

9

PRAGMA table_info(table-name);

该编译是用来获取你的表列的列表。

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

不要忘记敲定声明! – 2013-03-12 04:58:28

相关问题