Android – новая запись данных добавлена ​​к неправильному контакту

Я пытаюсь добавить запись данных в уже существующий контакт, я нахожу контакт, используя поиск по телефону, я беру поле контакта _id и добавляю новые данные с параметром raw_contact_id, установленным в поле _id. На некоторых контактах он просто не работает, он соответствует данным для разных контактов. (Я думаю, что это касается контактов, которые хранятся на сим-карте)

Пожалуйста, совет, возможно, у вас есть другой способ добавить данные

Образец кода:

 LinkedList<Long> lcv = new LinkedList<Long>(); ContentResolver cr = getContentResolver(); Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor c = cr.query(uri, null, null, null, null); try { while (c.moveToNext()) { Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, c.getString(c.getColumnIndex(PhoneLookup.LOOKUP_KEY))); Cursor c2 = getContentResolver().query(lookupUri, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null); try { if (c2.moveToNext()) { Log.i(TAG, "found: " + c2.getLong(c2.getColumnIndex(Contacts._ID)) + ", " + c2.getString(c2.getColumnIndex(Contacts.DISPLAY_NAME))); lcv.add(c2.getLong(c2.getColumnIndex(Contacts._ID))); } else { Log.e(TAG, "failed to lookup"); } } finally { c2.close(); } } } finally { c.close(); } for (Long rawid : lcv) { Cursor c3 = cr.query(RawContacts.CONTENT_URI, null, RawContacts.CONTACT_ID + "=?", new String[] {rawid+""}, null); if (c3.moveToNext()) { Log.e(TAG,"aaaa: " + c3.getString(c3.getColumnIndex(Contacts.DISPLAY_NAME))); } else { Log.e(TAG,"errrrror"); } ContentValues cv = new ContentValues(); cv.put(Data.RAW_CONTACT_ID, rawid + ""); cv.put(Data.MIMETYPE, MyMime.MIMETYPE); cv.put(Data.DATA1, "mydata"); cv.put(Data.SYNC1, syncvalue); Uri newIns = cr.insert(ContactsContract.Data.CONTENT_URI, cv); Log.i(TAG, "insert: " + newIns + ", " + name); } 

Solutions Collecting From Web of "Android – новая запись данных добавлена ​​к неправильному контакту"

Проблема заключается в том, что вы выбираете Contact._ID и используете этот идентификатор для заполнения данных в LinkedList lcv.

  Cursor c2 = getContentResolver().query(lookupUri, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null); 

Здесь вам действительно нужен RAW_CONTACT_ID .

DISPLAY_NAME можно получить либо из database/ContactsContract.Data' OR 'database/ContactsContract.CommonDataKinds.StructuredName' OR 'database/RawContactsEntity контактов database/ContactsContract.Data' OR 'database/ContactsContract.CommonDataKinds.StructuredName' OR 'database/RawContactsEntity . В более поздних 2 случаях вы сможете получить DISPLAY_NAME с помощью RAW_CONTACT_ID

Пара ключевых указателей:

  • Contacts._ID = Data.CONTACT_ID
  • RawContacts._ID = Data.RAW_CONTACT_ID
  • RawContacts.CONTACT_ID = Contacts._ID
  • RawContactsEntity._ID = RawContacts._ID

Звучит странно? Дай мне попробовать…

  1. База данных контактов разделена на 3 контакта таблиц, сырые контакты и данные .
  2. Каждая таблица содержит столбец (_ID), который является автоматически увеличивающимся первичным ключом.
  3. Таблица данных содержит всю контактную информацию, такую ​​как номер телефона, идентификатор почты, адрес и т. Д.
  4. Необработанные контакты указывают на созданный фактический контакт. Поэтому при добавлении контакта мы используем необработанные контакты .
  5. Пользователь не может добавлять данные в таблицу контактов . Данные в этой таблице заселены из-за агрегирования контактов .
  6. Причиной вашей логики для некоторых контактов является: _ID для контактов , сырые контакты остаются такими же, пока не произойдет какая-либо контактная агрегация. Допустим, вы добавили два контакта с тем же именем abc. Здесь _ID для сырых контактов увеличивается дважды, а _ID для контактов увеличивается только один раз, когда эти два контакта объединяются из-за агрегации контактов

См. Это для более подробной информации.

Лучший способ получить информацию в вашем случае – использовать ContactsContract.RawContactsEntity (внешнее соединение в таблице raw_contacts с таблицей данных)

Ссылка: http://developer.android.com/reference/android/provider/ContactsContract.RawContactsEntity.html