iPhone:Sqlite更新或插入行

时间:2012-02-27 05:53:09

标签: iphone ios sqlite

如果menuid已经可用,我想更新数量,否则添加新行。 我使用了以下代码。但没有添加或更新行。

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);

}
}

2 个答案:

答案 0 :(得分:0)

我可能只是缺乏对您的代码的正确理解,但它看起来并不像您正在开始然后在那里提交事务。我可能会离开基地,因为我从未在没有使用交易的情况下插入行。

答案 1 :(得分:0)

我发现它是我的自我: 将select语句更改为:

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

还将insert语句的if条件更改为

if ([quanty isEqualToString:@"(null)"])