2

アプリを作成し、sqlite で更新しています。これが私のコードです。

    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"appforoffice.sqlite"];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK))
    {
        NSLog(@"An error has occured.");
    }

    const char *sql = "UPDATE settings SET `value`='Off' WHERE `type`=?";
if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK)
    {
        if(sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1, SQLITE_TRANSIENT) == SQLITE_OK)
        {
            if(sqlite3_step(updateStmt) == SQLITE_DONE) {
                NSLog(@"Update Done successfuly");
            }
            else {
                 NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database));
            }

            sqlite3_finalize(updateStmt);
            sqlite3_close(database);
        }
        else
        {
            NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database));
        }
    }
    else
    {
        NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
    }

しかし、皆さん、エラーは発生していません。しかし、問題は、データベース テーブルがクエリの影響を受けていないことです。クエリは完全に問題ないと確信しています。

私はこの問題について混乱しています。これから抜け出す方法が見つかりません。

4

2 に答える 2

4

sqlite3_prepare_v2()ブール値を返さないため、戻り値をテストするの!は間違っています。参照から:

成功すると、ルーチンの sqlite3_prepare() ファミリーは SQLITE_OK を返します。それ以外の場合は、エラー コードが返されます。

したがって、コードは次のようになります。

if (sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK)
{
    if (sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1,
        SQLITE_TRANSIENT) == SQLITE_OK)
    {
        ... call update API ...
    }
    else
    {
        NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database));
    }
}
else
{
    NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
}

EDIT(質問がクエリ全体で更新された後):

クエリ内の ` 文字の見た目が好きではありません。それらを削除すると、動作するはずです。

于 2012-04-25T06:31:48.547 に答える
1

準備またはバインド メソッドなしで直接 sql コマンドを使用することを好みます

sqlite3_exec(database,[sql UTF8String],nil,nil,nil);

ここで、sql は update ステートメントを持つ NSString です。データベースが開いていることを確認してください

それが役立つことを願っています

于 2012-04-25T07:02:07.363 に答える