Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FMDB: add new column and insert data

In my app I'm using FMDatabase. I'm trying to add new column to existing table and then insert data in that column. When I added the column by Alter Table, I got no errors but when I'm trying to insert data in the table, I got error complaining about the newly added column that doesn't exist.

Here is my code

NSString *databasePath = [myDB getPlacesDBPath];

FMDatabase *db = [FMDatabase databaseWithPath:databasePath];

if (![db open])
{
    return ;
}

if (![db columnExists:@"placeName" inTableWithName:@"MYPLACES"])
{
    [db executeQuery:@"ALTER TABLE MYPLACES ADD COLUMN placeName TEXT"];
    // I tried to set the result of this query in "BOOL Success" and print the results and I got YES    
}

//Note: I have more than 12 columns but I didn't post all of them here
NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO  MYPLACES  ( placeID ,  placeName)  VALUES (\"%@\", \"%@\")", placeIDValue, placeNameValue ];

[db executeUpdate:insertSQL];

if ([db hadError]) {
    NSLog(@"error : %@",[db lastError]);
}

[db close];

I got the following error:

error : Error Domain=FMDatabase Code=1 "table MYPLACES has no column named placeName" UserInfo=0xe340920 {NSLocalizedDescription=table MYPLACES has no column named placeName}

What's the problem? how to know why the new column is not added?

like image 768
Sawsan Avatar asked Jan 01 '14 15:01

Sawsan


People also ask

How do I add data to an existing column?

INSERT INTO Syntax 1. Specify both the column names and the values to be inserted: INSERT INTO table_name (column1, column2, column3, ...)

What is Fmdatabase?

FMDB is an Objective-C wrapper around the C-style API provided by Apple for SQLite. It's important to note the SQLite is not an Apple proprietary technology. SQLite is an open source C-language library used by Apple, Android, Skype, and many other clients and applications to provide a robust database engine.


1 Answers

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.

like image 155
Rob Avatar answered Oct 18 '22 12:10

Rob