【问题标题】:Check If column already exist and if not Alter Table in sqlite检查列是否已存在,如果不存在,则在 sqlite 中更改表
【发布时间】:2012-04-15 20:02:39
【问题描述】:

我想在我的应用中更改一个 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);
    }
}

【问题讨论】:

    标签: iphone objective-c ios ipad sqlite


    【解决方案1】:

    使用以下函数检查列是否存在。实际上未检查,因此您可能必须检查语法。概念就像如果您能够创建准备好的语句而不是列存在,否则不存在。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 别忘了完成声明!
      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2012-11-12
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多