1

sqlite db を更新しようとしています。これは私が使用しているコードです

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

        const char * sql;
        sql = "update tms  set name = ?,place=?,stars=?  where id=?";

        sqlite3_stmt *selectStatement;

        //prepare the select statement
        int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL);
        if(returnValue == SQLITE_OK)
        {
            sqlite3_bind_text(selectStatement, 1,[[payloadDict  valueForKey:@"userName"] UTF8String] , [[payloadDict  valueForKey:@"userName"] length],SQLITE_STATIC);
            sqlite3_bind_text(selectStatement, 2,[[payloadDict  valueForKey:@"locName"] UTF8String], [[payloadDict  valueForKey:@"locName"] length],SQLITE_STATIC);
            sqlite3_bind_int(selectStatement, 3, [[payloadDict  valueForKey:@"starCount"] integerValue]);
            sqlite3_bind_int(selectStatement, 4, [[payloadDict  valueForKey:@"rowid"] integerValue]);
            int success = sqlite3_step(selectStatement);
            if(success == SQLITE_DONE)
            {
                isExist = TRUE;
            }
            else {
                //NSAssert1(0,@"Error: Failed to Update %s",sqlite3_errmsg(database));
            }
    }

sqlite3_step を実行すると、値 101 が成功として取得されます。ただし、データベースは新しい値で更新されません。どうすればこれを適切に行うことができますか?ありがとう

4

1 に答える 1

1

データベースがディレクトリにあることを確認するという@ottの優れた提案に同意しますDocuments(ただし、エラーが発生すると思いました)。

また、返された値を再確認して、テーブル内の既存の行のいずれかの列[[payloadDict valueForKey:@"rowid"] integerValue]の値と一致することを確認します。id何にも一致しない場合は、何も更新されていなくてもsqlite3_step返されます。SQLITE_DONE

また、id値がテキスト文字列ではなく数値として格納されていることを確認することもできます。SQLite は、最初にデータを挿入したときに最初に指定したデータ型で値を格納できるようにすることについてかなり緩いためです。 table が定義されている)、WHEREデータがもともとテキスト値として格納されていた場合、数値の一致を検索する句が成功するかどうかはわかりません。システムが自動的に値を定義する のidような列定義を使用した場合、これは問題ではありませんが、手動でid INTEGER PRIMARY KEY AUTOINCREMENTid列、再確認する必要があるかもしれません。(一般に、文字列をその場で数値として解釈することは非常にうまく機能しますが、問題となる奇妙な状況がいくつかあります。その数値を取得するために、sqlite はテキスト値 "5,127" のコンマをどう処理すればよいかわからず、数値を 5127 ではなく 5 として解釈します。)

于 2012-09-15T18:52:34.817 に答える