2012-03-09 72 views
4

我需要對ContactsContract.Data表進行查詢,並且CONTACT_ID列中的值將不同(不同)。聯繫人的不同CONTACT_IDContract.Data

代碼:

所有的
final Uri uri = ContactsContract.Data.CONTENT_URI; 
final String[] projection = new String[] {// 
    ContactsContract.Data.CONTACT_ID, // 
    ContactsContract.Data._ID, // 
    ContactsContract.Data.DISPLAY_NAME,// 
    ContactsContract.Data.LOOKUP_KEY // 
}; 
final StringBuilder selectionBuilder = new StringBuilder(); 
selectionBuilder.append(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID); 
selectionBuilder.append("= ? AND "); 
selectionBuilder.append(ContactsContract.Data.MIMETYPE); 
selectionBuilder.append("= ? "); 
final String selection = selectionBuilder.toString(); 
final String[] selectionArgs = new String[] {// 
    String.valueOf(groupId), // 
    ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE // 
}; 
return context.getContentResolver().query(uri, projection, selection, selectionArgs, null); 

首先,我試圖在投影添加 「DISTINCT」 到ContactsContract.Data.CONTACT_ID。但是有一個例外:java.lang.IllegalArgumentException: Invalid column DISTINCT contact_id

然後,我寫的是這樣的:

"'DISTINCT "+ContactsContract.Data.CONTACT_ID+"'". 
java.lang.IllegalArgumentException: Invalid column 'DISTINCT contact_id' 

然後,我添加到selectionBuilder:

selectionBuilder.append(" GROUP BY ").append(ContactsContract.Data.CONTACT_ID); 

再次,一個例外:android.database.sqlite .SQLiteException:靠近「GROUP」:語法錯誤:在編譯時:SELECT contact_id, _id, display_name, lookup FROM view_data_restricted data WHERE (1) AND (data1= ? AND mimetype= ? GROUP BY contact_id) ORDER BY display_name ASC

最後,我在sortOrder,b之後追加了「group by」語句ut:

android.database.sqlite.SQLiteException: near "GROUP": syntax error: , while compiling: SELECT contact_id, _id, display_name, lookup FROM view_data_restricted data WHERE (1) AND (data1= ? AND mimetype= ?) ORDER BY display_name ASC GROUP BY contact_id 

是否有可能使用不同的查詢? 也許,我應該附加一些東西給URI?

回答

4

如果正在下面ICS定位裝置,則可以通過該組由前添加)使用GROUP_BY子句和(後:

selectionBuilder.append(") GROUP BY (") 

作爲ICS及以上,查詢解釋器是更智能的,並關閉任何未封閉的括號以防止注射。

但是,我不明白爲什麼你需要不同的contact_ids在這裏。聯繫人應該只有一個數據可以與一個組關聯,因此您可能會在每行上收到不同的聯繫人。

此外,可能與http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_GROUP_URI有關,它沒有記錄,但考慮到它的位置,它可能直接訪問屬於某個組的聯繫人。你會使用這個URI:

Uri uri = ContentUri.withAppendedId(ContactsContract.Contacts.CONTENT_GROUP_URI, groupId); 

,然後查詢它像Contacts.CONTENT_URI

+0

是的,我發現你的問題,你的搜索GROUP BY的注入。我發現它非常有趣:)太可惜了,它是一個黑客,它被阻止:) 但是,我尋求的共同決定,不僅爲GroupMembership。它也必須移植到CommonDataKinds.Phone--我知道它的CONTENT_FILTER_URI,但我的客戶想要過濾任何部分的電話號碼。 – QuickNick 2012-03-09 15:02:51

+0

我喜歡你答案,但是我想打開賞金,導致這個問題沒有得到足夠的重視。也許,你的答案是最好的。 – QuickNick 2012-03-12 11:16:55

相關問題