как синхронизировать контакты а не rawContacts в android syncAdapter? - PullRequest
0 голосов
/ 01 октября 2019

Моя цель - организовать список контактов пользователей в локальной базе данных SQLite для Android в организованном порядке.

с помощью адаптера синхронизации, первоначальная синхронизация занимает около минуты без проблем.

Проблема состоит в том, чтобы синхронизировать изменения,

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

Поскольку необработанные контактысодержит дубликаты, мне нужно выяснить, как объединить их в локальной базе данных или отфильтровать их при создании базы данных.

При использовании объединения возникают проблемы при обновлении контакта. Иногда не все необработанные контакты получают грязный флаг, вызывая несогласованность.

При попытке фильтрации по идентификатору контакта при создании базы данных у меня возникают проблемы при удалении, поскольку необработанный контакт CONTACT_ID по какой-то причине равен '0',очень трудно удалить его.

Работая над этим уже несколько дней, я уверен, что мне здесь чего-то не хватает.

Ниже приведены основные функции моего текущего адаптера синхронизации (при условии объединения дубликатов).

@SuppressLint("ApplySharedPref")
private void step3UpdateContacts( ) {

    Cursor c;

    if (lastContactId < 0) {
        c = getContactsForTheFirstTime() ;
    } else {
        c = getDirtyContacts();
    }

    BatchOperation batchOperation = new BatchOperation(getContext(),
            getContext().getContentResolver());

    try {
        while (c.moveToNext()) {
            final long rawContactId = c.getLong( DirtyQuery.COLUMN_RAW_CONTACT_ID);
            final boolean isDeleted = "1".equals(c.getString(DirtyQuery.COLUMN_DELETED));
            final long contactId = c.getLong( DirtyQuery.COLUMN_CONTACT_ID);

            if (isDeleted) {
                deleteContactFlag(rawContactId, batchOperation);
                deleteContact(rawContactId);
            } else {
                clearDirtyFlag(rawContactId,batchOperation);

                if (rawContactId > lastContactId){ //New contact
                    addContact(rawContactId,contactId);
                    lastContactId = rawContactId;
                } else {
                    updateContact(contactId);
                }
            }
        }

    } finally {
        if (c != null) {
            c.close();
        }
    }

    batchOperation.execute();

    PreferenceManager.getDefaultSharedPreferences(getContext()).edit()
            .putLong(PREF_LAST_CONTACT_ID, lastContactId).commit();
}

private void deleteContact(long rawContactId) {
    mContentResolver.delete(
            ContentUris.withAppendedId( ContactContract.Entry.CONTENT_URI_RAW,
                    rawContactId ),
            null,
            null);
}

private void updateContact(long contactId) {
    Cursor cursor = mContentResolver.query(
            ContentUris.withAppendedId( ContactContract.Entry.CONTENT_URI_CONTACTS, contactId ),
            null,null,null,null);

    mContentResolver.delete(
            ContentUris.withAppendedId( ContactContract.Entry.CONTENT_URI_CONTACTS, contactId ),
            null,null);

    long rawContactId;

    while(cursor.moveToNext()) {
        rawContactId = cursor.getLong(
                cursor.getColumnIndex( ContactContract.Entry.COLUMN_RAW_CONTACT_ID ) );
        addContact(rawContactId,contactId);
    }
}

private void addContact(long rawContactId, long contactId) {

    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection    = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER};


    Cursor cursor = mContentResolver.query(
            uri,
            projection,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
            new String[]{String.valueOf( contactId )}, null);

    while(cursor.moveToNext()) {
        String phoneNo = cursor.getString(1);

        String parsedPhone = parsePhone(phoneNo);

        String uid = "";

        for (User user : mUsers) {
            if (parsedPhone.equals( user.getPhone() )) {
                uid = user.getUid();
                break;
            }
        }

        ContentValues values = new ContentValues(  );
        values.put( ContactContract.Entry.COLUMN_RAW_CONTACT_ID,rawContactId );
        values.put( ContactContract.Entry.COLUMN_NAME,cursor.getString( 0 ) );
        values.put( ContactContract.Entry.COLUMN_RAW_PHONE,phoneNo );
        values.put( ContactContract.Entry.COLUMN_PARSED_PHONE,parsedPhone);
        values.put( ContactContract.Entry.COLUMN_UID,uid);
        values.put( ContactContract.Entry.COLUMN_CONTACT_ID,contactId);
        mContentResolver.insert( ContactContract.Entry.CONTENT_URI_CONTACTS,values);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...