2012-02-27 14 views
1

メニューIDがすでに利用可能な場合は数量を更新し、それ以外の場合は新しい行を追加します。 私は次のコードを使用しました。しかし、行は追加または更新されません。iPhone:Sqliteの更新または挿入行

sqlite3 *database; 
    sqlite3_stmt *addStmt=nil; 
    if (selection== nil) { 
     selection [email protected]"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); 

} 
} 

答えて

0

私はそれを私の自己を発見した: はにselect文を変更:

NSString *sqlStmt=[NSString stringWithFormat:@"select quantity from item where menuid = %@ and spiciness = '%@'",itemId,selection]; 

はまた

if ([quanty isEqualToString:@"(null)"]) 
にinsert文の場合は、条件を変更しました
0

私はちょうどあなたのコードの適切な理解を欠いているかもしれないが、それはあなたが始まり、そこにトランザクションをコミットしているようには見えません。私はトランザクションを使わずに行を挿入したことがないので、私はベースから離れているかもしれません。

関連する問題