2012-06-14 244 views
4

大家好我试图从联系人数据库中使用ContentResolver与这些字段的联系人信息想要获取姓名,号码,FORMATTED_ADDRESS,PHOTO 联系人的详细信息在一个单一的查询。在单个查询中获取联系人的详细信息

所以基本上我需要每个联系人3个查询来获得这些 的细节。

我想知道的是,有没有更简单,更高效的方法来实现这个目标。

但使用下面的代码我收到异常。

java.lang.IllegalArgumentException: Invalid column data1 

任何机构都可以帮助我找到相同的解决方案。

Uri uri    = ContactsContract.Contacts.CONTENT_URI; 
String[] projection = new String[] { ContactsContract.Contacts._ID, 
             ContactsContract.Contacts.DISPLAY_NAME, 
             ContactsContract.CommonDataKinds.Phone.NUMBER, 
             ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, 
             ContactsContract.CommonDataKinds.Photo.PHOTO}; 
String selection  = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'"; 
String[] selectionArgs = null; 
String sortOrder  = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

Cursor contacts   = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); 

回答

4

也许问题出在selection。用你的方法替换我的方法。

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
String[] projection = new String[] { ContactsContract.Contacts._ID, 
             ContactsContract.Contacts.DISPLAY_NAME, 
             ContactsContract.CommonDataKinds.Phone.NUMBER, 
             ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, 
             ContactsContract.CommonDataKinds.Photo.PHOTO}; 
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?"; 
String[] selectionArgs = { String.valueOf(1) }; 
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

Cursor contacts = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); 

您应该始终使用parametrized statements。你的方法很危险。你的URI很糟糕。

+0

感谢您的答复,但我在执行代码'java.lang.IllegalArgumentException异常后得到同样的异常:无效的列data1' –

+0

现在就试试吧,你有不好的uri。我没有立即注意到它。 – Sajmon

+0

删除选择和selectionArgs后,它为我工作的查询,但它不会给我FORMATTED_ADDRESS代替这个它它给PHONE_NUMBER不知道为什么。但在调试时,我发现它返回的列是“_id,display_name,data1,data1,data15”,它不会给它们的原始名称。还有一个问题是它使光标没有更多的问题。的记录,并且我在通讯簿中有更多记录 –

1

在这里你去

更换

ContactsContract.Contacts.CONTENT_URI; 

ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
+0

感谢Vipul的回复,我已经使用了你给定的URI,并从查询中删除选择和selectionArgs后,它为我工作,但它不会给我FORMATTED_ADDRESS到位它给PHONE_NUMBER不知道为什么,但在调试时,我发现它返回的列是“_id,display_name,data1,data1,data15”,它不会给它们原来的名称。记录,并且我在联系簿中有更多记录 –

+0

尝试执行Cursor contacts = getContentResolver()。query(uri,null,null,null,null); –

+0

什么是URI? ContactsContract.CommonDataKinds.Phone.CONTENT_URI; –

相关问题