2014-05-21 73 views
3

我想根据therir ID获取联系人列表的光标。我不确定如何将“IN”语句与一组参数一起使用。我目前造成的错误。ContentResolver和“IN”语句中的“where”条件

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):在编译:选择_id,DISPLAY_NAME,has_phone_number FROM view_contacts WHERE((1))AND((_id IN)?)ORDER BY DISPLAY_NAME

+0

它会导致哪个错误? – duplode

+0

@duplode,我更新了我的问题 – Anarion

+0

您是否试图根据一个id或几个基于ID数组的结果返回一个结果? –

回答

6

我没有测试这个,但我认为你需要将你的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; 
    } 
+0

我做了同样的事情,但用于循环。有用。 – Anarion

0

我们可以添加在一部分本身

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"); 
} 

这里如果选择的参数值是字符串需要加转义字符selectionArguments。