Android 根据帐户名查询原始联系人表时缺少联系人ID
我无法从RawContacts表中获取所有联系人IDAndroid 根据帐户名查询原始联系人表时缺少联系人ID,android,android-contentprovider,android-contacts,Android,Android Contentprovider,Android Contacts,我无法从RawContacts表中获取所有联系人ID private void displayAllContactsByType(String accountName) {//e.g accountName="WHATSAPP" Cursor rawCursor = null; rawCursor = cResolver.query( ContactsContract.RawContacts.CONTENT_URI,
private void displayAllContactsByType(String accountName)
{//e.g accountName="WHATSAPP"
Cursor rawCursor = null;
rawCursor = cResolver.query(
ContactsContract.RawContacts.CONTENT_URI,
new String[]{ContactsContract.RawContacts.CONTACT_ID},
ContactsContract.RawContacts.ACCOUNT_NAME + "= ?",
new String[]{accountName},
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE LOCALIZED ASC");
rawCursor.moveToFirst();
int contactIdColumn = rawCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID);
int rawCursorCount = rawCursor.getCount();
int total = 1;
Utils.Log("Raw Size", " " + rawCursorCount);//rawCursorCount is correct here
while (rawCursor.moveToNext()) {
Long contactId = rawCursor.getLong(contactIdColumn);
publishProgress(((total * 100) / rawCursorCount));
progressBar.setProgressNumberFormat("" + total + "/" + rawCursorCount);
storeContactDetails(contactId, accountName);
++total;
//I am facing problem in this method only below code is just for understanding.
}
}
联系人id通过帐户名传递给下面的方法,以从各自的id获取联系人详细信息,但联系人id与日志//Utils.log(“原始大小”,“rawCursorCount+rawCursorCount”)相比较少
private void storeContactDetails(长id、字符串accountName){
光标=空;
字符串[]投影=新字符串[]{ContactsContract.CommonDataTypes.Phone.CONTACT\u ID,
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
Contacts contract.CommonDataTypes.Phone.HAS_Phone_号码,
Contacts contract.CommonDataTypes.Phone.NUMBER,
Contacts contract.Contacts.LOOKUP_键,
“账户名称”,
电话号码
};
//游标c=cResolver.query(ContactsContract.Data.CONTENT\u URI,投影,ContactsContract.Data.RAW\u CONTACT\u ID+“=?”,新字符串[]{String.valueOf(ID)},null);
phones=cResolver.query(Phone.CONTENT\u URI,
预测
Phone.CONTACT_ID+“=?”,
新字符串[]{String.valueOf(id)},
无效);
moveToFirst();
getResultsFromPhoneCursor(电话、帐户名);
}
public void getResultsFromPhoneCursor(光标电话,字符串accountName){
int colorcounter=0;
字符串[]colorcounter_数组={“#91A46B”、“#8BB6B5”、“#CAA973”、“#8DA6C8”、“#D19B8D”};
int颜色_字符串;
字符串email_Id=“”;
字符串contactType=“”;
试一试{
contactId=0;
字符串hasPhone=“”;
显示_name=“”;
电话号码=”;
contactId=phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.CONTACT\u ID));
display_name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.display_name)).trim();
hasPhone=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.HAS_Phone_NUMBER));
if(hasPhone.equalsIgnoreCase(“1”))
hasPhone=“true”;
其他的
hasPhone=“false”;
if(Boolean.parseBoolean(hasPhone)){
做{
this.accountName=phones.getString(phones.getColumnIndex(“account_name”));
phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
int type=phones.getInt(phones.getColumnIndex(Phone.type));
开关(类型){
case Phone.TYPE_HOME:
contactType=“主页”;
打破
手机壳。手机类型:
contactType=“手机”;
打破
case Phone.TYPE_工作:
contactType=“工作”;
打破
}
String lookupKey=phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
if(颜色计数器<5){
color_string=color.parseColor(colorcounter_数组[colorcounter]);
彩色计数器++;
}否则{
颜色计数器=0;
color_string=color.parseColor(colorcounter_数组[colorcounter]);
彩色计数器++;
}
Cursor emails=cResolver.query(ContactsContract.commondatatypes.Email.CONTENT_URI,新字符串[]{ContactsContract.commondatatypes.Email.DATA},
ContactsContract.CommonDataTypes.Email.CONTACT_ID+“=”+contactId,null,null);
while(emails.moveToNext()){
email\u Id=emails.getString(emails
.getColumnIndex(ContactsContract.CommonDataTypes.Email.DATA));
}
电子邮件。关闭();
if(this.accountName.equalsIgnoreCase(accountName)){
如果(!contactList.contains(新的ContactsWrapper(contactId、display\u name、phoneNumber、lookupKey、false、color\u string、email\u Id、contactType)))
contactList.add(新ContactsWrapper(contactId、display_name、phoneNumber、lookupKey、false、color_字符串、email_Id、contactType));
}
}
while(phones.moveToNext());
电话。关闭();
}
}捕获(例外e){
e、 printStackTrace();
}
}
请帮我解决这个问题,或者建议其他获取联系人ID的方法。提前感谢。问题是您失去了从数据库获取的第一个联系人 语句
rawCursor.moveToFirst()代码>将光标定位在第一条可用的结果记录上。当您想要迭代结果时,可以在循环内调用rawCursor.moveToNext()
。循环条件在其主体之前执行,因此,您最终将光标移动到第二行,丢失第一条记录
您可以通过删除rawCursor.moveToFirst()
来解决此问题
private void storeContactDetails(Long id, String accountName) {
Cursor phones = null;
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.Contacts.LOOKUP_KEY,
"account_name",
Phone.TYPE
};
//Cursor c=cResolver.query(ContactsContract.Data.CONTENT_URI,projection,ContactsContract.Data.RAW_CONTACT_ID + " = ?",new String[]{String.valueOf(id)} ,null);
phones = cResolver.query(Phone.CONTENT_URI,
projection,
Phone.CONTACT_ID + " = ?",
new String[]{String.valueOf(id)},
null);
phones.moveToFirst();
getResultsFromPhoneCursor(phones, accountName);
}
public void getResultsFromPhoneCursor(Cursor phones, String accountName) {
int colorcounter = 0;
String[] colorcounter_array = {"#91A46B", "#8BB6B5", "#CAA973", "#8DA6C8", "#D19B8D"};
int color_string;
String email_Id = "";
String contactType = "";
try {
contactId = 0;
String hasPhone = "";
display_name = "";
phoneNumber = "";
contactId = phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
display_name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)).trim();
hasPhone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER));
if (hasPhone.equalsIgnoreCase("1"))
hasPhone = "true";
else
hasPhone = "false";
if (Boolean.parseBoolean(hasPhone)) {
do {
this.accountName = phones.getString(phones.getColumnIndex("account_name"));
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
switch (type) {
case Phone.TYPE_HOME:
contactType = "HOME";
break;
case Phone.TYPE_MOBILE:
contactType = "MOBILE";
break;
case Phone.TYPE_WORK:
contactType = "WORK";
break;
}
String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
if (colorcounter < 5) {
color_string = Color.parseColor(colorcounter_array[colorcounter]);
colorcounter++;
} else {
colorcounter = 0;
color_string = Color.parseColor(colorcounter_array[colorcounter]);
colorcounter++;
}
Cursor emails = cResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Email.DATA},
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);
while (emails.moveToNext()) {
email_Id = emails.getString(emails
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
}
emails.close();
if (this.accountName.equalsIgnoreCase(accountName)) {
if (!contactList.contains(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType)))
contactList.add(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType));
}
}
while (phones.moveToNext());
phones.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}