ContentResolver.query
は選択引数をエスケープしますか?ContentResolver.queryは引数をエスケープしますか、それとも単に疑問符を置き換えますか?
例えば、私は手動で
Cursor c = contentResolver.query(uri, null, "mimetype=?", selArgs, null);
またはそれがquery
方法で行われているような何かを行う前にselArgs
で引数をエスケープする必要がありますか?
ContentResolver.query
は選択引数をエスケープしますか?ContentResolver.queryは引数をエスケープしますか、それとも単に疑問符を置き換えますか?
例えば、私は手動で
Cursor c = contentResolver.query(uri, null, "mimetype=?", selArgs, null);
またはそれがquery
方法で行われているような何かを行う前にselArgs
で引数をエスケープする必要がありますか?
いいえ、コンテンツプロバイダで手動で行う必要があります。クエリ機能の
ソースコード:
public final Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
IContentProvider provider = acquireProvider(uri);
if (provider == null) {
return null;
}
try {
long startTime = SystemClock.uptimeMillis();
Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder);
if (qCursor == null) {
releaseProvider(provider);
return null;
}
// force query execution
qCursor.getCount();
long durationMillis = SystemClock.uptimeMillis() - startTime;
maybeLogQueryToEventLog(durationMillis, uri, projection, selection, sortOrder);
// Wrap the cursor object into CursorWrapperInner object
return new CursorWrapperInner(qCursor, provider);
} catch (RemoteException e) {
releaseProvider(provider);
// Arbitrary and not worth documenting, as Activity
// Manager will kill this process shortly anyway.
return null;
} catch (RuntimeException e) {
releaseProvider(provider);
throw e;
}
}
これは別の 'query'関数にクエリを委譲します。 'provider.query'で始まる行を見てください。 'IContentProvider.query'の契約は何ですか? – aioobe
クエリは、指定されたURIを処理できるコンテンツプロバイダに委任されます。あなたはandroid.content.ContentProviderを拡張するコンテンツプロバイダを持っていますか?あなたのウリは何ですか? – Blehi
私は一般的なケースに興味がありますが、特定のシナリオではありません。 (言い換えれば、私の質問には特定のURIが含まれていません) – aioobe
より多くの私はそれについて考える、より多くの私はそれが* *適切な引数をエスケープしないことを確信しています。 AFAIKの異なるDBMSは、異なるエスケープルーチンを持つことがあります。 'query'コントラクトが特定のDBMSにバインドされていても、それがコンテンツリゾルバをサポートしていたDBMSを知っていることは理解できません。 – aioobe