Skip to main content

iPhone: Sqlite update or insert row



I want to update the quantity if the menuid is already available otherwise add a new row. I used the following code.But no row is added or updated.







sqlite3 *database;

sqlite3_stmt *addStmt=nil;

if (selection== nil) {

selection =@"Medium";

}

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {



const char *select="select quantity from item where menuid = ?";

sqlite3_stmt *selectstmt;

if(sqlite3_prepare_v2(database, select, -1, &selectstmt, NULL) == SQLITE_OK) {



while(sqlite3_step(selectstmt) == SQLITE_ROW) {

menuID= [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];

char *quant = (char *)sqlite3_column_text(selectstmt,1);

quantity=[NSString stringWithUTF8String:(char *)quant];

// [self.ids addObject:menuID];



}

sqlite3_reset(selectstmt);

}

NSString *quant=[NSString stringWithFormat:@"%@",quantity];





if (quant == @"") {

if (addStmt == nil) {

// const char *sql = "delete from item";

const char *sql = "insert into item(menuid,itemName,price,quantity,spiciness) Values( ?, ?, ?, ?,?)";



if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)

NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));

}

// NSLog(@"ADDSTMT:%@",addStmt);

sqlite3_bind_int(addStmt, 1, [itemId integerValue]);

sqlite3_bind_text(addStmt, 2, [name UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_double(addStmt, 3, [priceItem doubleValue] );

sqlite3_bind_int(addStmt, 4, number);

sqlite3_bind_text(addStmt, 5, [selection UTF8String],-1,SQLITE_TRANSIENT);

NSLog(@"Name:%@",name);

NSLog(@"MENU IDe%@",priceItem);



if(SQLITE_DONE != sqlite3_step(addStmt)){

// NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

}

else

//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid



menuID = [NSDecimalNumber numberWithLongLong:sqlite3_last_insert_rowid(database)];



//Reset the add statement.

sqlite3_reset(addStmt);



}





else{

if (addStmt == nil) {

// const char *sql = "delete from item";

const char *sql = "update item set quantity= ? where menuid = ?";



if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)

NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));

}

// NSLog(@"ADDSTMT:%@",addStmt);

sqlite3_bind_int(addStmt, 2, [itemId integerValue]);

number=number+[quant intValue];

sqlite3_bind_int(addStmt, 1, number);



NSLog(@"Name:%@",name);

NSLog(@"MENU IDe%@",priceItem);



if(SQLITE_DONE != sqlite3_step(addStmt)){

// NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

}

else

//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid



menuID = [NSDecimalNumber numberWithLongLong:sqlite3_last_insert_rowid(database)];



//Reset the add statement.

sqlite3_reset(addStmt);







sqlite3_close(database);



}

}




Comments

  1. I might be just lacking proper understanding of your code but it doesn't look like you're beginning and then committing a transaction in there. I might be way off base though as I've never inserted a row without using a transaction.

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?