FMDB: add new column and insert data FMDB: add new column and insert data sqlite sqlite

FMDB: add new column and insert data


I see nothing in the above simplified code sample to explain the error you report. The problem may rest elsewhere (or, perhaps in the process of simplifying the code sample, you eliminated the source of the problem).

That having been said, I had a couple of reactions:

  1. You said:

    I tried to set the result of this query in "BOOL Success" and print the results and I got YES

    I don't know how that's possible, because executeQuery returns a FMResultSet not a BOOL. This is moot, though, because your ALTER TABLE statement should be performed with executeUpdate not executeQuery. (The latter should still work, but the former is more logical.)

  2. I don't understand why you removed the error checking. That's the best way to identify issues.

  3. Completely unrelated, but you should never use stringWithFormat when building your SQL. You open yourself up to SQL failures resulting from unexpected input (e.g. what if one of your values had double quotes inside it). Worse, you expose yourself to SQL injection attacks. Instead, use ? placeholders in the SQL and then just pass the values as parameters to the executeUpdate (or executeQuery) method.

So, the following code worked fine for me:

BOOL success;FMDatabase *db = [FMDatabase databaseWithPath:databasePath];if (![db open]){    NSLog(@"open failed");    return;}if (![db columnExists:@"placeName" inTableWithName:@"MYPLACES"]){    success = [db executeUpdate:@"ALTER TABLE MYPLACES ADD COLUMN placeName TEXT"];    NSAssert(success, @"alter table failed: %@", [db lastErrorMessage]);}NSString *insertSQL = @"INSERT INTO  MYPLACES  (placeID, placeName)  VALUES (?, ?)";success = [db executeUpdate:insertSQL, placeIDValue, placeNameValue];NSAssert(success, @"insert failed: %@", [db lastErrorMessage]);[db close];

Since I don't see what would cause the problem you describe, I can only suggest you single-step through this code in your debugger and make sure it's following the path you think it is.


Swift 3 code :

 let db = FMDatabase(path: Util.getPath(databasePath)    guard db != nil else { return }    db!.open()    if !(db!.columnExists("tableName", columnName: "USERID")) {        let alterTable = "ALTER TABLE tableName ADD COLUMN USERID TEXT"        if db!.executeUpdate(alterTable, withArgumentsIn: nil) {            printf(“new column added”)    }    else {        printf(“issue in operation”)    }    db!.close()

May be help someone.Keep coding..


The problem is that -[FMDatabase executeQuery:] does not execute submitted instructions, it only prepares the statement.

To execute them you need to perform a "step".

In FMDB that is done by -[FMResultSet next], internally - by call to sqlite3_step( ).

Since -executeUpdate: (in contrast to -executeQuery:) does that for you and finalizes the statement - it may be more appropriate for this purpose.

So if you really need to use -executeQuery:

FMResultSet *rs = [db executeQuery:@"ALTER TABLE MYPLACES ADD COLUMN placeName TEXT"];[rs nextWithError:&error]; // error handling is recommended here[rs close];

But -executeUpdate: is more concise

BOOL success = [db executeUpdate:@"ALTER TABLE MYPLACES ADD COLUMN placeName TEXT"];