Android: правильный доступ и запросы с использованием Raw Contact Id

Итак, мое приложение пытается интегрировать адаптер синхронизации в собственный диспетчер контактов 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);

Из Data.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, который я вернул? Это не имеет никакого смысла! У кого-нибудь есть понимание? Спасибо всем.


person JMRboosties    schedule 15.03.2011    source источник
comment
Что такое BatchOperationForSync? И проверьте, сохраняете ли вы правильную обратную ссылку или нет.   -  person Karan    schedule 15.03.2011


Ответы (1)


Вместо этого метод lookupRawContactId должен выглядеть следующим образом:

private static long lookupRawContact(ContentResolver resolver, String username) {
    Log.e("Looking up Raw Contact", username);
    long authorId = 0;
    Cursor cursor = resolver.query(RawContacts.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;
}

Обратите внимание, что вместо этого запрос ищет RawContacts.CONTENT_URI.

person JMRboosties    schedule 20.03.2011
comment
JMRboosties, скажите, пожалуйста, что означает UserIdQuery.PROJECTION. Что я должен объявить для UserIdQuery - person AndroidRaji; 27.09.2012
comment
Мне нужен Raw ContactID, пожалуйста, скажите мне, как я могу получить RawContactID - person AndroidRaji; 27.09.2012
comment
static final class UserIdQuery { private UserIdQuery() {} public final static String[] PROJECTION = new String[]{RawContacts._ID}; общедоступный окончательный статический интервал COLUMN_ID = 0; public static final String SELECTION = RawContacts.ACCOUNT_TYPE + = '+ com.tagapp.android + ' AND + RawContacts.SOURCE_ID + =?; } Курсор курсора =getContentResolver().query(RawContacts.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[]{first_name}, null); try{ if(cursor.moveToNext()) { authorId = cursor.getLong(UserIdQuery.COLUMN_ID);}} - person AndroidRaji; 27.09.2012