-1

同じ連絡先の複数の電話番号を更新する必要があります。電話番号は 1 つしか更新できませんが、たとえば 2 つを更新する方法がわかりません

これが私のコードです...

String stEtPhone = etPhone.getText().toString();

values.clear();
String phoneWhere = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?";
String[] phoneWhereParams = new String[]{String.valueOf(idContacto),ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,stEtPhone);
cr.update(ContactsContract.Data.CONTENT_URI, values, phoneWhere, phoneWhereParams); 
4

1 に答える 1

1

コードは、WHERE句に一致するすべての行を更新する必要があります。一致するはずの余分な行があることがわかっている場合は、何かが間違っています。

ContactsContract.CommonDataKinds.Phone.NUMBER考えられるテスト方法の 1 つ: 最初に、指定されたに一致するものを照会し、ContactsContract.Data.RAW_CONTACT_ID返されるものの数を確認することができます。

必要に応じて (これが既に行っていることとどの程度異なるかはわかりませんが)、結果while(cursor.moveToNext())を反復処理し、電話番号が更新しようとしている番号と一致する場合はupdateそれを行います。

これはテストされていない、すぐに使えるコードであるため、おそらく小さなバグがあることに注意してください。実際にこれを行う場合は、List<ContentProviderOperation>これを 1 つずつ実行するのではなく、 を使用してからバッチ操作を実行することをお勧めします。

ContentResolver resolver = getContentResolver();
String[] columnsToReturn = {Data._ID, ContactsContract.CommonDataKinds.Phone.NUMBER}
// This should return all of the phone numbers that match your criteria
Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI, columnsToReturn, phoneWhere, phoneWhereParams, null);

while(cursor != null && cursor.moveToNext()){
    // This code doesn't do this, but you might want to see how many items 
    // are returned in your cursor here to verify that you're getting what 
    // you should for some known case..

    // I'm using the row ID here (Data._ID) to update, instead of your initial WHERE
    resolver.update(ContactsContract.Data.CONTENT_URI, values, Data._ID + "=?", cursor.getString(cursor.getColumnId(Data._ID));

}

UPDATEステートメントですべてが正しく設定されていれば、最初にクエリを実行する必要さえありません。

この質問に添付されているコードのチャンクも役立つ場合があります。

于 2012-08-20T15:14:13.817 に答える