Android: запрос распознавателя контента, возвращающий 0 строк, когда он не должен - PullRequest
2 голосов
/ 13 марта 2011
Cursor cursor = resolver.query(
    Data.CONTENT_URI,
    DataQuery.PROJECTION,
    DataQuery.SELECTION,
    new String[] {String.valueOf(rawContactId)},
    null);

С PROJECTION:

public static final String[] PROJECTION = new String[] {
    Data._ID,
    Data.MIMETYPE,
    Data.DATA1,
    Data.DATA2,
    Data.DATA3};

и SELECTION:

public static final String SELECTION = Data.RAW_CONTACT_ID + "=?";

rawcontactId возвращает значения, я сделал записи впроверять.Чтобы придать этому некоторый контекст, я работаю с учетной записью синхронизации.Цель состоит в том, чтобы найти столбцы данных для существующих контактов и записать поверх них любые новые данные.Я работаю со следующим примером кода, предоставленным Android: http://developer.android.com/resources/samples/SampleSyncAdapter/src/com/example/android/samplesync/platform/ContactManager.html

Чтобы подвести итог моей проблемы, у меня есть два контакта через эту синхронизированную учетную запись, которые добавляются без проблем, но не могут быть обновлены,Кто-нибудь имеет опыт работы с этим?Спасибо.

РЕДАКТИРОВАТЬ: Вот мой метод возврата rawContact

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;
}

Номера, которые я получаю, похожи на 3061. Вот класс UserIdQuery:

final private static class UserIdQuery {

    private UserIdQuery() {

    }

    public final static String[] PROJECTION = new String[] {RawContacts._ID};
    public final static int COLUMN_ID = 0;
    public static final String SELECTION = RawContacts.ACCOUNT_TYPE + "='" + 
        "com.tagapp.android" + "' AND " + RawContacts.SOURCE_ID + "=?";

}

ИВот мой конструктор для класса ContactSyncOperations, используемого для добавления нового контакта.Идентификатор источника здесь - это имя пользователя, такое же, как я вызываю в своем аргументе SELECTION.

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());
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Произошла ошибка в методе lookupRawContactId, долго получаемый rawcontactId был неправильным. Это должно было выглядеть так:

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;
} 
1 голос
/ 13 марта 2011

Есть несколько проблем, которые я мог бы найти с помощью следующего запроса:

Cursor cursor = resolver.query(Data.CONTENT_URI, 
                               UserIdQuery.PROJECTION, 
                               UserIdQuery.SELECTION, 
                               new String[] {username}, null);
  1. Если все столбцы указывают на таблицу RawContacts, тогда вы должны использовать RawContacts.CONTENT_URI вместо Data.CONTENT_URI.
  2. Здесь значение RawContacts.SOURCE_ID сравнивается с именем пользователя

    public static final String SELECTION = RawContacts.ACCOUNT_TYPE + "='" + 
            "com.tagapp.android" + "' AND " + RawContacts.SOURCE_ID + "=?";
    
    new String[] {username}
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...