检查列是不是已存在,如果不存在,则在 sqlite 中更改表

Posted

技术标签:

【中文标题】检查列是不是已存在,如果不存在,则在 sqlite 中更改表【英文标题】: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);
    

【问题讨论】:

【参考方案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;

【讨论】:

别忘了完成声明!

以上是关于检查列是不是已存在,如果不存在,则在 sqlite 中更改表的主要内容,如果未能解决你的问题,请参考以下文章

Android Sqlite 如果不存在则插入

SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users

如果 iPhone 应用程序中不存在,则在表中插入记录

如何以编程方式检查 Photoshop 画笔是不是存在

如何遍历列,检查任何列中是不是存在特定值,改变新列并输入 1 如果存在,如果不存在则输入 0?

已验证的现有列上的 SQLite 数据库“没有此类列”错误