Актуализирайте множество телефонни номера в контакт

Опитах се да актуализирам множество телефонни номера на конкретен контакт, използвайки следния код:

for(int j=0;j<allPhoneNumbersLength;j++)
{
PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
String phoneValue = phoneInfo.getValue();
int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
if(phoneType == Phone.TYPE_HOME)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_HOME);
}
else if(phoneType == Phone.TYPE_WORK)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_WORK);
}
else if(phoneType == Phone.TYPE_FAX_HOME)
{
builderPhone.withValue(Phone.NUMBER, phoneValue)
.withValue(Phone.TYPE, Phone.TYPE_FAX_HOME);
}
op_list.add(builderPhone.build());

}
getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);

С помощта на този код се опитвам да актуализирам три номера, но само номерът „TYPE_FAX_HOME“ се актуализира, а другите два номера са премахнати от контакта.

Моля, помогни ми.


person Parveen    schedule 09.02.2013    source източник
comment
Първо, тук използвате else-if. Надявам се, че знаете, че ще бъде въведено само 1 от твърденията в стълбата. След това каква е стойността на phoneType?   -  person RainMaker    schedule 09.02.2013
comment
Редактирах кода.   -  person Parveen    schedule 09.02.2013


Отговори (4)


Научих от вашия код, че използвате една и съща стойност на телефонен номер за всичките 3 вида. Следователно, докато показва, android ще показва само 1 от тях за контакта. Но ако действително редактирате контакта, там можете да видите, че всичките 3 типа са попълнени с един и същи номер.

P.S: Предполагам, че контактът, за който се опитвате да редактирате, вече има попълнен номер за всичките 3 типа. Ако не, моля, създайте ги и след това опитайте да стартирате кода си.

person RainMaker    schedule 09.02.2013
comment
Да, ти си прав. Но същият телефонен номер е попълнен с един и същи тип три пъти. Трябва ли да знаете защо? - person Parveen; 09.02.2013
comment
приятелю, използвал си phoneValue навсякъде. Наистина се съмнявам дали това ще се промени. Проверете своя цикъл FOR. Той има една и съща phoneValue за всички типове телефонни номера. - person RainMaker; 09.02.2013
comment
Редактирах кода, phoneValue също се промени, както и phoneType. - person Parveen; 09.02.2013
comment
ако получите различни стойности за всеки String phoneValue = phoneInfo.getValue();, тогава вашият код ще работи. - person RainMaker; 09.02.2013

Еха ... ! защо използвате израза "ако"?! вашият код може да бъде така:

for(int j=0;j<allPhoneNumbersLength;j++)
{
    PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
    int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
    ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
        .withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
    builderPhone.withValue(Phone.NUMBER, phoneValue)
        .withValue(Phone.TYPE, phoneType);
    op_list.add(builderPhone.build());
}
getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);
person NeatAttack    schedule 09.02.2013
comment
Голям улов. Ще сменя кода. Трябва ли да знаете защо последният телефонен номер е актуализиран и защо други номера са премахнати от контакт? - person Parveen; 09.02.2013

Не съм Android програмист, но мисля, че проблемът е в последния ред от кода, цикълът актуализира информацията за контакт във всяка стъпка, но не я прилага, в крайната стъпка на цикъла прилага актуализация и последните промени трябва да се прилагат, ако промените кода си по този начин, мисля, че трябва да работи, това означава, че за всяка стъпка на цикъл информацията за контакт ще се актуализира:

for(int j=0;j<allPhoneNumbersLength;j++)
{
    PhoneInfo phoneInfo = (PhoneInfo) allPhoneNumbers.elementAt(j);
    int phoneType = phoneInfo.getIndex(); // phoneType = Phone.TYPE_HOME,  Phone.TYPE_WORK, etc
    ContentProviderOperation.Builder builderPhone = ContentProviderOperation.newUpdate(Data.CONTENT_URI)
        .withSelection(ContactsContract.Data.CONTACT_ID + "=?"+" AND "+ContactsContract.Data.MIMETYPE + "=?" + " AND "+Phone.TYPE+"=?",  new String[]{String.valueOf(contactID), Phone.CONTENT_ITEM_TYPE, String.valueOf(phoneType)});
    builderPhone.withValue(Phone.NUMBER, phoneValue)
        .withValue(Phone.TYPE, phoneType);
    op_list.add(builderPhone.build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);
}
person NeatAttack    schedule 09.02.2013

Проблем с емулатора на Android. Кодът работи добре в реално устройство. Благодаря за цялата ви помощ.

person Parveen    schedule 12.02.2013