Проверьте, существует ли уже столбец, а если нет, измените таблицу в sqlite. - PullRequest
13 голосов
/ 02 апреля 2012

Я хочу изменить таблицу 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);
    }
}

Ответы [ 2 ]

32 голосов
/ 02 апреля 2012

Используйте следующую функцию для проверки существования столбца.Практически не проверено, поэтому вам, возможно, придется проверить синтаксис.Концепция похожа на то, что если вы в состоянии создать подготовленное утверждение, то столбец существует иначе.

-(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
}
9 голосов
/ 02 апреля 2012

PRAGMA table_info(table-name);

Эта прагма используется для получения списка столбцов в вашей таблице.

Для получения более подробной информации, посетите здесь

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...