Android - новая запись данных добавлена ​​в неправильный контакт - PullRequest
9 голосов
/ 01 марта 2011

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

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

пример кода: </p> <pre><code>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); }

1 Ответ

53 голосов
/ 01 марта 2011

Проблема заключается в выборе Contacts._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. В последующих двух случаях вы сможете получить 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. Пользователь не может добавить какие-либо данные в таблицу contacts . Данные в этой таблице заполняются из-за совокупности контактов 1064 *.
  6. Причина, по которой ваша логика работает для некоторых контактов: _ID для контактов , необработанные контакты остается неизменной до тех пор, пока любое объединение контактов. Допустим, вы добавили два контакта с одинаковым именем abc. Здесь _ID для необработанных контактов увеличивается вдвое, а _ID для контактов увеличивается только один раз, так как эти два контакта объединяются из-за агрегация контактов

Подробнее см. .

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

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

...