コードは、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
ステートメントですべてが正しく設定されていれば、最初にクエリを実行する必要さえありません。
この質問に添付されているコードのチャンクも役立つ場合があります。