Итак, мое приложение пытается интегрировать адаптер синхронизации с собственным диспетчером контактов Android.Это все работает гладко, за исключением того, что после синхронизации контакта я не могу его обновить.Подробности об этой конкретной проблеме можно найти здесь: Android: запрос распознавателя контента, возвращающий 0 строк, когда не следует Но я могу подвести итог, просто сказав, что мой запрос распознавателя контента возвращает 0 значений, потому что яя полагаю, что запрашивает неправильный URI.
Когда я записываю необработанный идентификатор контакта в телефон, я делаю это с помощью следующего кода:
public ContactSyncOperations(Context context, String username,
String accountName, BatchOperationForSync batchOperation) {
this(context, batchOperation);
mBackReference = mBatchOperation.size();
mIsNewContact = true;
mValues.put(RawContacts.SOURCE_ID, username);
mValues.put(RawContacts.ACCOUNT_TYPE, "com.tagapp.android");
mValues.put(RawContacts.ACCOUNT_NAME, accountName);
mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);
mBatchOperation.add(mBuilder.build());
}
Этот метод конструктора вызывается, когда выдобавление нового контакта в список синхронизации:
private static void addContact(Context context, String account, Contact contact, BatchOperationForSync batchOperation) {
ContactSyncOperations contactOp = ContactSyncOperations.createNewContact(context, contact.getUsername(), account, batchOperation);//constructor called @ this line
contactOp.addName(contact.getFirstName(), contact.getLastName());
contactOp.addEmail(contact.getEmail());
contactOp.addPhone(contact.getPhoneNumber(), Phone.TYPE_MOBILE);
contactOp.addPhone(contact.getHomePhone(), Phone.TYPE_HOME);
contactOp.addPhone(contact.getWorkPhone(), Phone.TYPE_WORK);
contactOp.addProfileAction(contact.getUsername());
Log.e("Adding contact", "Via sync");
}
Как вы можете видеть в конструкторе, я вызываю метод с именем newInsertCpo, который можно просмотреть здесь:
private void addInsertOp() {
if(!mIsNewContact) {
mValues.put(Phone.RAW_CONTACT_ID, mRawContactId);
}
mBuilder = newInsertCpo(addCallerIsSyncAdapterParameter(Data.CONTENT_URI), mYield);
mBuilder.withValues(mValues);
if(mIsNewContact) {
mBuilder.withValueBackReference(Data.RAW_CONTACT_ID, mBackReference);
}
mYield = false;
mBatchOperation.add(mBuilder.build());
}
Сейчасчто вы можете увидеть код, позвольте мне объяснить проблему.Когда я создаю и записываю необработанный идентификатор контакта, я делаю это для RawContacts.CONTENT_URI:
mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);
Однако, когда я запрашиваю URI, я запрашиваю так:
Cursor cursor = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] {String.valueOf(rawContactId)}, null);
Из данных.CONTENT_URI.Я верю, что именно здесь происходит моя проблема.Я использовал пример кода с официального сайта разработчика Android и адаптировал его для своих собственных нужд, но эта часть довольно верна для примера.Все же это не работает.Я веду то, что я сказал, я пишу одному Ури и опрашиваю другого.Но я попытался изменить запрос на RawContacts.CONTENT_URI (который вызвал исключение), а также изменить URI, который я записываю в Data.CONTENT_URI, что также вызывает исключение.Что еще более запутанно, так это то, что я получаю необработанные идентификаторы контактов из Data.CONTENT_URI, когда выполняю свой метод lookupRawContactId:
private static long lookupRawContact(ContentResolver resolver, String username) {
Log.e("Looking up Raw Contact", username);
long authorId = 0;
Cursor cursor = resolver.query(Data.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null);
try {
if(cursor != null && cursor.moveToFirst()) {
authorId = cursor.getLong(UserIdQuery.COLUMN_ID);
}
} finally {
if(cursor != null) {
cursor.close();
}
}
return authorId;
}
Так что, если я получу курсор, возвращающий rawcontactId, почему я получаю 0 значений, запрашивающих этоттот же Uri с тем же rawcontactId я был возвращен?Это не имеет никакого смысла!У кого-нибудь есть понимание?Спасибо всем.