0

iPhoneアプリでsqliteの問題を実験しています。読み取り部分は問題ありませんが、UPADATE コマンドを使用してデータベースに書き込もうとすると (INSERT も試します)、SQL 文でエラー sqlite3_errmsg が返されます。

Failed. Error is:  near "UP": syntax error

コードは次のとおりです。

-(void)ratesInfotoDb:(NSString *)idx rate:(NSString*)rate{

    query =@"UPDATE rules set rate = 5 where _id = 1994";

    sqlite3_stmt *statement;
    sqlite3_prepare_v2(_database, [query UTF8String], SQLITE_OPEN_READWRITE, &statement, nil);

    if(sqlite3_step(statement) == SQLITE_DONE ) {
        NSLog(@"element added");
        }
    else{
        NSLog( @"Failed. Error is:  %s", sqlite3_errmsg(_database));
    }

    sqlite3_finalize(statement);
    sqlite3_close(_database);

}

クエリ コマンド "UPDATE rules set rate = 5 where _id = 1994" (データベースで直接実行) が機能するので、クエリは正しいと思います。

誰か助けてくれませんか?

4

3 に答える 3

3

問題は簡単です。関数に間違った値を渡していますsqlite3_prepare_v2。3 番目のパラメーターは、クエリ文字列の長さを表す必要があります。

マクロSQLITE_OPEN_READWRITEの値は である2ため、クエリの長​​さは 2 バイトしかないと述べていますが、これは正しくありません。

呼び出しをsqlite3_prepare_v2次のように変更します。

sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil);

渡すと、クエリの実際の長さを取得するように-1指示されます (おそらく を使用して)。sqlite3_prepare_v2strlen

ところで - 常に の戻り値をチェックし、sqlite3_prepare_v2それが返されることを確認してSQLITE_OKください。

于 2013-10-17T14:19:14.813 に答える
1

この方法を試してみてください...

データベースが開かれていません。適切に開く方法の例については、このメソッドを参照してください。

-(void)executeQuery:(NSString *)query
{
    sqlite3_stmt *statement;
    if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK)
    {
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(statement) != SQLITE_DONE)
            {
                sqlite3_finalize(statement);
            }
        }
        else
        {
            NSLog(@"query Statement Not Compiled");
        }

        sqlite3_finalize(statement);
        sqlite3_close(database);
    }
    else
    {
        NSLog(@"Data not Opened");
    }
}
于 2013-10-17T13:42:51.267 に答える
-1
         NSString *status;


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *dbPath=[[NSString alloc]initWithString:[documentsDir stringByAppendingPathComponent:@"YOUR DATABASE NAME.sqlite"]];

    NSLog(@"Database Path %@",dbPath);

    sqlite3_stmt    *statement;
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

        NSLog(@"open");

        NSString *updateSQL = [NSString stringWithFormat: @"UPDATE rules set rate = 5 where _id = 1994"];

        const char *update_stmt = [updateSQL UTF8String];
        sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            status=@" Updated";
        }

        else
        {
            status=@"Error occured";
        }
于 2013-10-17T13:46:06.393 に答える