Android: Escape SQL in Activity.managedQuery ()

Ik ontwikkel een Android-applicatie die een query maakt met behulp van Activity.managedQuery() , waarvoor een String moet worden gebruikt voor het argument selection . Het argument is de WHERE -clausule van een SQL-instructie, maar met uitzondering van het sleutelwoord WHERE .

Mijn applicatie gebruikt de voor- en achternaam van mensen die mogelijk in het adresboek van de gebruiker staan. Sommige mensen hebben echter een naam die een enkel aanhalingsteken bevat. Bijvoorbeeld John O'Reilly . Dit veroorzaakt een SQLiteException omdat het enkele aanhalingsteken de reeks heeft beëindigd en het niet weet hoe Reilly moet worden behandeld.

Ik heb geprobeerd een simpele handeling uit te voeren:
naam = naam.replace ("'", "\\'");
Maar dit werkte niet.

De volledige uitzondering ziet er als volgt uit:

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)

Dit is mijn code:

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 antwoord

gebruik 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
toegevoegd