ios - 如果列存在则更改表,如果不存在则添加

标签 ios objective-c sqlite

如果该列已经存在,我想更改表。如果没有,我想添加它。

我的代码:

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

最佳答案

使用以下函数检查列是否存在。实际上没有检查,所以你可能需要检查语法。概念就像如果您能够创建准备好的语句,则列不存在。

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

关于ios - 如果列存在则更改表,如果不存在则添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971716/

相关文章:

ios - UICollectionView 与 2 组部分 headerViews

php - 使用循环将记录插入 SQL 数据库

ios - 在 Swift 中子类化 UIView - 错误

iOS ARKit 指向 anchor 的指针

java - 如何用 Java 开发 iPhone 应用程序?

objective-c - 在 UITableView 中禁用删除 1 个单元格

delphi - SQLite 或 Blackfish - 我应该在 delphi 应用程序中使用什么?

android - 关还是不关?

iphone - 在ios中覆盖表View Cell中的内容

ios - 在 iOS 上安装 Firebase/Crashlytics NEDNSProxyProvider 网络扩展