ContentResolver和“IN”语句在“where”条件下

我正在尝试基于therir id获取光标以获取联系人列表。 我不确定如何使用带有参数数组的“IN”语句。 我目前有什么导致错误。

public Cursor GetContacts(String[] ids) { ContentResolver cr = getContentResolver(); try { Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER }; String where = ContactsContract.Contacts._ID + " IN ?"; String[] selectionArgs = ids; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME; return cr.query(uri, projection, where, selectionArgs, sortOrder); } catch (Exception ex) { String message = ex.getMessage(); Log.e("mine", "Error: " + message, ex); return null; } 

错误:接近“?”:语法错误(代码1):,编译时:SELECT _id,display_name,has_phone_number FROM view_contacts WHERE((1))AND((_id IN?))ORDER BY display_name

我没有测试这个,但我认为你需要将你的id压缩成一个逗号分隔的字符串,以便将它插入到你的查询中。

 public Cursor GetContacts(String[] ids) { ContentResolver cr = getContentResolver(); try { Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER }; String where = ContactsContract.Contacts._ID + " IN (?)"; String[] selectionArgs = {StringUtils.join(ids, ", ")}; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME; return cr.query(uri, projection, where, selectionArgs, sortOrder); } catch (Exception ex) { String message = ex.getMessage(); Log.e("mine", "Error: " + message, ex); return null; } 

我们可以在part本身的位置添加selectionArguments

 public Cursor getCursor() { Uri contentUri = Uri.withAppendedPath(ContentProviderDb.CONTENT_URI, TABLE_FEEDS); String feedList = "27","79","78","77","31"; String where = FEED_ID + " IN ("+feedList+") AND " + PLACE_ID + "=\"" +placeId+"\" AND " + PROFILE_ID + "=" + userId ; return context.getContentResolver().query(contentUri, null, where, null, TIMESTAMP + " DESC"); } 

这里如果选择参数值是String,则需要添加转义字符。