1

私のコードは以下のとおりですが、アプリケーションがクラッシュします。私はまだdbの操作にかなり慣れていませんが、それは理にかなっているようです。これが機能しない理由の兆候はありますか?

 public void updateLevel(String level){
             mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null);
         }
4

3 に答える 3

2

あなたDefaultは列名として解釈されます。文字列の場合は、を使用する必要があります'Default'

このようなフォーマットの問題を回避するには、SQLコマンドでとして記述されているパラメーターを使用することをお勧めします?。それらは、の2番目のパラメーターrawQuery(または他のSQL関数の同様のパラメーター)の対応するエントリーから値を取得します。これは、文字列を配置するよりも簡単で、文字列内'でエスケープすることを忘れないで'ください。また、制御文字を含む文字列を使用できるようになります。

mDb.rawQuery("UPDATE "+ DATABASE_TABLE +
             " SET " + KEY_CUR_LEVEL + " = " + level +
             " WHERE " + KEY_NAME + " = ?",
             new String[] { "Default" });
于 2012-10-17T16:00:55.100 に答える
1

2つの問題があります。

1)SQLインジェクションのため、rawQueryの使用は推奨されていません。可能であれば、SQLiteDatabaseクエリを使用してください。

2)列のタイプがvarcharの場合、値は一重引用符で囲む必要があります。

例:

mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);

注:上記のクエリは手動で入力されたものであり、構文エラーが発生する可能性があります。

于 2012-10-17T16:01:14.363 に答える
1

updateメソッドを使用すると、人為的エラーが発生しにくくなります。

ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);

mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});
于 2012-10-17T16:12:50.210 に答える