Android:Activity.managedQuery()のSQLをエスケープする

私は、 selection 引数のStringをとる Activity.managedQuery()を使用してQueryを作成するAndroidアプリケーションを開発しています。引数は、SQLステートメントの WHERE 句ですが、 WHERE キーワードは除きます。

私のアプリケーションでは、ユーザーのアドレス帳に登録されているユーザーの名字が使用されます。しかし、一部の人は一重引用符を含む名前を持っています。たとえば、 John O'Reilly などです。一重引用符が文字列を終了し、 Reilly の処理方法がわからないため、 SQLiteException が発生します。

私は単純なことをやってみました:
name = name.replace( "'"、 "\\'");
しかし、これはうまくいかなかった。

完全な例外は次のようになります。

android.database.sqlite.SQLiteException: near "Reilly": syntax error: , while compiling:     
SELECT raw_contact_id, display_name FROM view_data_restricted data WHERE (1) AND 
(in_visible_group = '1' AND display_name ='John O\'Reilly') ORDER BY display_name 
COLLATE LOCALIZED ASC
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:330)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
at android.content.ContentResolver.query(ContentResolver.java:262)
at android.app.Activity.managedQuery(Activity.java:1550)
at org.jonescb.myApp.MyClass.queryFriends(MyClass.java:68)

これは私のコードです:

fname = fname.replace("'", "\\'");
Uri contacts = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
    ContactsContract.Data.RAW_CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP +
                " = '1' AND " + ContactsContract.Contacts.DISPLAY_NAME +
                " ='" + fname + "'";
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +
                " COLLATE LOCALIZED ASC";
Cursor cursor = activity.managedQuery(
                contacts,
                projection,
                selection,
                null,
                sortOrder
                );
0

1 答え

selectionArgumentsを使用する

Uri contacts = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
    ContactsContract.Data.RAW_CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP +
                " =? AND " + ContactsContract.Contacts.DISPLAY_NAME +
                " =?";
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +
                " COLLATE LOCALIZED ASC";
Cursor cursor = activity.managedQuery(
                contacts,
                projection,
                selection,
                new String[] {"1", fname},
                sortOrder
                );
3
追加された