1

そのため、Androidを学習しているときに、の使用ContentProvider方法と、を使用して正しく挿入する方法について多くのアドバイスをもらいましたSqliteDatabase。今、私には意味のないエラーがあります。少なくとも、誰もが私に言っていたことすべてについてです。エラーは次のとおりです。

android.database.sqlite.SQLiteException: near "s": syntax error:
while compiling: SELECT * FROM events WHERE time_stamp='07/21/2012 2:59:03 PM' AND
event='Test This's'

'どこにも表示されない限り、すべてが正常に機能します。エスケープする必要があるので、理由はわかります。しかし、これは意味がありません。なぜなら、生のクエリを使用せず、提供されているバインディングメソッドを使用するように言われているからです。私の例が何であるかを提供させてください:

ContentValues newValues = new ContentValues();
newValues.put("event_id", eventId);
newValues.put("event_name", eventName);
newValues.put("start_date", startDate);
newValues.put("start_time", values.getAsString("start_time"));
newValues.put("end_date", endDate);
newValues.put("end_time", values.getAsString("end_time"));
newValues.put("location", values.getAsString("location"));
Long success = database.insert("events_info", null, newValues);

私が理解できたことから、それをバインドすることを想定しているので、なぜこれを回避する必要があるのですか?これがとのような他の方法にのみ適用される場合を除きquery()ますupdate()。どちらの場合でも、AndroidにSQLiteを挿入するための文字列を準備する際の適切な方法に誰かが光を当てることを望んでいます。前もって感謝します。

4

1 に答える 1

2

SELECT * FROM events WHERE time_stamp='07/21/2012 2:59:03 PM' AND event='Test This's'

ご存じのとおり、日付文字列'07/21/2012 2:59:03 PM'は正しく区切られていますが、イベント文字列は正しく区切られ'Test This's'ていません。

文字列を変更する簡単な修正'Test This''s'

「入力をどのように修正して検証するか」という一般的な問題は、実際には非常に大きな問題であり、単なる「引用符」区切り文字以外にも多くの問題が関係しています。

おそらく、最善の防御策は「クエリ引数」を使用することです。

EXAMPLE:
p_query = "select * from mytable where name_field = ?";
mDb.rawQuery(p_query, new String[] { uvalue });

このトピックに関する適切なチュートリアルを見つけるのに驚くほど苦労しました-申し訳ありません。これが私ができる最善のことです:

関連トピック「SQL インジェクション」に関する優れた記事を次に示します。

最後に、本当に入力文字列を「エスケープ」したい場合は、単純な Java String.replaceAll () を使用するよりも悪い結果になる可能性があります。

于 2012-07-21T19:18:10.063 に答える