1

次のコードは、文字列 dbDate に格納されている Date(Primary Key) = 今日の日付である行の 2 つの列 (HoursWorked と TotalEarned) を更新することを想定しています。私の更新文字列が間違って書かれている可能性があると思います。アラート ビューがトリガーされています。

        sqlite3_stmt *newstatement;
        sql =[NSString stringWithFormat:@"UPDATE HourLog SET HoursWorked = '%@', TotalEarned = '%@' WHERE Date ='%@'", HoursWorked, TotalEarned, dbDate];
        if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &newstatement, nil)==SQLITE_OK){

            NSLog(@"details updated");

            UIAlertView *alertDialog;
            alertDialog = [[UIAlertView alloc]
                           initWithTitle:@"Title"
                           message:@"Details Updated!"
                           delegate:nil
                           cancelButtonTitle:@"Close"
                           otherButtonTitles: nil];
            [alertDialog show];
            sqlite3_step(newstatement);
        }

        sqlite3_finalize(newstatement);
        sqlite3_close(db);
4

1 に答える 1

1

いくつかの問題:

  1. UPDATE構文が正しくありません。更新される個々のフィールドは、単語ではなくコンマで区切る必要がありますAND

  2. の結果を確認するまで、更新が成功したことを報告しないでくださいsqlite3_step

  3. 句がヒットしない場合は、句が成功WHEREしたことを確認できるように、更新された行数を特定することをお勧めします。WHERE

  4. そして、いつもsqlite3_errmsgのように、SQLite の呼び出しが失敗したり、盲目的に飛行している場合は報告してください。

したがって:

sqlite3_stmt *statement;

int originalTotalCount = sqlite3_total_changes(db);

NSString *sql = [NSString stringWithFormat:@"UPDATE HourLog SET HoursWorked = %@ , TotalEarned = %@ WHERE Date='%@'", HoursWorked, TotalEarned, dbDate];

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) != SQLITE_OK) {
    NSLog(@"%s: prepare failed: %s", __FUNCTION__, sqlite3_errmsg(db));
} else {
    if (sqlite3_step(statement) != SQLITE_DONE) {
        NSLog(@"%s: step failed: %s", __FUNCTION__, sqlite3_errmsg(db));
    } else {
        int rowsUpdated = sqlite3_total_changes(db) - originalTotalCount;

        NSString *message;

        if (rowsUpdated == 1)
            message = @"Updated one row";
        else if (rowsUpdated == 0)
            message = @"No rows updated";
        else
            message = [NSString stringWithFormat:@"Updated %d rows", rowsUpdated]; // should never happen

        NSLog(@"%@", message);

        UIAlertView *alertDialog = [[UIAlertView alloc] initWithTitle:nil
                                                              message:message
                                                             delegate:nil
                                                    cancelButtonTitle:@"Close"
                                                    otherButtonTitles:nil];
        [alertDialog show];
    }

    sqlite3_finalize(statement);
}

HoursWorked個人的には、との数値を一重引用符で囲みませんTotalEarnedまた、確立されたSQLite 日付形式のいずれかで日付を保存することを検討することもできます。

于 2013-11-07T18:52:50.067 に答える