Android 在单个查询中获取联系人的详细信息

Android 在单个查询中获取联系人的详细信息,android,android-contacts,android-contentprovider,Android,Android Contacts,Android Contentprovider,大家好,我正在尝试使用ContentResolver从联系人数据库获取联系人信息,这些字段包括姓名、号码、格式化的地址、照片 一次查询中联系人的详细信息 所以基本上我需要每个联系人进行3次查询才能获得这些信息 细节 我想知道的是,有没有更简单、更有效的方法 要做到这一点 但是使用下面的代码,我得到了一个异常 java.lang.IllegalArgumentException: Invalid column data1 有谁能帮我找到同样的解决办法吗 Uri uri

大家好,我正在尝试使用ContentResolver从联系人数据库获取联系人信息,这些字段包括姓名、号码、格式化的地址、照片 一次查询中联系人的详细信息

所以基本上我需要每个联系人进行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);

问题可能出现在
选择中。用我的方法代替你的方法

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);
您应该始终使用
参数化语句
。你的方法很危险。您的URI不正确。

给您

替换

ContactsContract.Contacts.CONTENT_URI;


感谢您的回复,但在实现您的代码
java.lang.IllegalArgumentException:Invalid column data1
后,我收到了相同的异常,请立即尝试,您的uri不正确。我没有立即注意到。从查询中删除selection和SelectionAgs后,它对我有效,但它不会给我格式化的地址,而是给我电话号码。我不知道为什么。但在调试时,我发现它返回的列是“\u id,display\u name,data1,data1,data15”,它不会给出它们的原始名称。还有一个问题,它使游标的记录数减少了,我在联系人簿中有更多的记录是的,现在我正在尝试使用此URI contacts contract.commondatatypes.Phone.CONTENT\u urio获取格式化的地址您需要使用
contacts contract.commondatatypes.StructuredPostal.CONTENT\u URI
感谢Vipul的回复,我已经使用了您给定的URI,在从查询中删除selection和selectionArgs后,它对我有效,但它不会给我格式化的地址来代替它,它会给我电话号码。我不知道为什么。但在调试时,我发现它返回的列是“\u id,display\u name,data1,data1,data15”,它不会给出它们的原始名称。还有一个问题,它使游标的记录数减少了,我在联系人簿中有更多的记录尝试执行游标contacts=getContentResolver().query(uri,null,null,null,null);URI是什么?ContactsContract.CommonDataTypes.Phone.CONTENT\u URI;ContactsContract.CommonDataTypes.Phone.CONTENT\u URI;它返回了大约72列,但非将给出格式化的_地址和照片
ContactsContract.CommonDataKinds.Phone.CONTENT_URI;