0

私はそのように構造化されたデータベースを持っています

uid | username | password |     email   | cur_level
1     default      abc123   me@email.com    0

私のゲームでは、メイン アクティビティのレベルを完了した後、increase_current_level() value++ というメソッドを実行します。test_db.open(); test_db.updateLevel(値); cur_level = 値; test_db.close();

問題なく動作するように見えますが、test_db.updateLevel(value)実行するとプログラムがクラッシュします。

私の DBHelper では、更新レベルのコードは次のとおりです。

public boolean updateLevel(String level) {
        ContentValues args = new ContentValues();

        args.put(KEY_CUR_LEVEL, level);
        return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "="
                + "WHERE id=(SELECT max(id) FROM DATABASE_TABLE)", null) > 0;

    }

私のログ猫のエラーは次のようです:

10-17 17:36:10.833: E/AndroidRuntime(1815): Caused by: android.database.sqlite.SQLiteException: near "WHERE": syntax error (code 1): , while compiling: UPDATE test SET cur_level=? WHERE _id=WHERE id=(SELECT max(id) FROM DATABASE_TABLE)

私は SQLite に非常に慣れていないので、ちょっと怖いですが、誰かが非常に明白な欠陥を見つけてくれることを願っています. ありがとう

更新 1:

私の更新されたコード:

public boolean updateLevel(String level) {
    ContentValues args = new ContentValues();

    args.put(KEY_CUR_LEVEL, level);
    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + " = (SELECT max(id) FROM DATABASE_TABLE",
            null) > 0;

}

更新されたエラー メッセージ:

10-17 18:26:50.804: E/AndroidRuntime(3684): Caused by: android.database.sqlite.SQLiteException: near "DATABASE_TABLE": syntax error (code 1): , while compiling: UPDATE test SET cur_level=? WHERE _id = (SELECT max(id) FROM DATABASE_TABLE
4

4 に答える 4

1

の構文mDb.update

update(table, ContentValues values, String whereClause, String[] whereArgs)

と仮定しましょうKEY_ROWID = "id"

あなたのためにwhereClause、あなたは文字通り合格しています

"id = WHERE id = (SELECT max(id) FROM DATABASE_TABLE"

これは有効な SQL ではありません。

" " は必要ないようですid =WHERE節を " WHERE id="で始めるだけです

ただし、あなたの質問は、DB にレコードが 1 つしかないことを意味します。1 つのレコードに DB を使用する理由 また、複数のレコードがある場合は、を使用するのWHEREではなく、一意のものを検索する句を使用する必要がありますSELECT max(id)

肝心なのは、SQL の知識を向上させる必要があるということです。

于 2012-10-17T21:54:37.883 に答える
1

コードから、WHERE 句の形式が正しくない可能性があります。そうじゃないかな

"WHERE id=(SELECT max(id) FROM " + DATABASE_TABLE

それ以外の

"WHERE id=(SELECT max(id) FROM DATABASE_TABLE)"

?

于 2012-10-17T21:51:01.853 に答える
0

テーブルに行が 1 つしかない場合は、WHERE 句は必要ありません。次のステートメントは、テーブル内のすべての行を更新する必要があります。レコードが 1 つしか存在しない場合は、これで問題が解決します。

return mDb.update(DATABASE_TABLE, args, null, null) > 0;

複数の行が存在する場合、update 関数を呼び出す前に、更新する行の uid を知る必要があります。その場合は、次のようになります...

String dbID = "更新する行の一意の ID";

return mDb.update(DATABASE_TABLE, args, "id=?", new String[]{dbID}) > 0;

お役に立てれば。

于 2012-10-18T00:12:22.530 に答える
0

update関数は既にクエリに a を入れており、列名 ( and )WHEREを複製しています。使用する:KEY_ROWID"id"

mDb.update(..., KEY_ROWID + "= (SELECT ...)");
于 2012-10-17T21:55:52.237 に答える