Какой самый быстрый способ создать большое количество контактов?

В моем приложении мне нужно создать большое количество контактов.

Код, который я сейчас использую:

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accounts[0].type)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accounts[0].name)
                .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
                        .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number)
                        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME)
                        .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number)
                        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                        .build());


        try {
            cr.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Для некоторого количества контактов код работает идеально, но если я создам большое количество, этот код будет работать медленно. Поэтому мой вопрос: какой самый быстрый способ создать большое количество контактов?

Заранее спасибо, любые предложения идей приветствуются.


person Greezer    schedule 24.05.2012    source источник
comment
Сколько контактов вам нужно? Как быстро вы хотите загрузить эти контакты?   -  person Paweł Nadolski    schedule 24.05.2012


Ответы (1)


Если вы можете синхронизироваться с gmail, вы можете импортировать контакты в gmail.com (в формате CSV) и синхронизировать их с телефоном.

Или просто посмотрите на этот похожий вопрос: Вставка тысяч контактов записи с использованием applyBatch работают медленно

person Paweł Nadolski    schedule 24.05.2012
comment
Они также могут быть добавлены в ContactsProvider (с использованием пакетов) адаптером синхронизации Google для ContactsContract. Никакого реального улучшения скорости там нет. - person Jens; 24.05.2012
comment
@Jens, улучшение скорости заключается во времени разработки решения, создание большого CSV-файла тривиально, а алгоритм синхронизации, созданный Google, должен быть оптимальным. - person Paweł Nadolski; 24.05.2012
comment
однако его вопрос касался code workt (sic) to slow, и, как показано в его вставленном примере, у него уже есть ContentProviderOperation, необходимые для вставки новых контактов в произвольную учетную запись. Операция синхронизации Google, скорее всего, будет дельта-синхронизацией, т. е. изменениями с момента последней синхронизации, т. е. в лучшем случае те же операции, которые он пытается выполнить, но с дополнительными накладными расходами на HTTP, протокол и синтаксический анализ. - person Jens; 24.05.2012
comment
Добавлена ​​также ссылка на похожие вопросы, которые должны дать некоторые подсказки, как это сделать в коде. - person Paweł Nadolski; 24.05.2012
comment
Правильно-ой. Просто к сведению для @Greezer - в более поздних версиях (например, ICS) bulkInsert также будет возвращаться так же, как applyBatch после того, как вы достигли предопределенного постоянного количества операций в своей массе/партии. - person Jens; 24.05.2012
comment
спасибо за ваши ответы. @Paweł Nadolski, я хочу добавить около 600 контактов с несколькими номерами, которые нужно объединить с родными контактами Android. Я тоже смотрел по вашей ссылке но не нашел название родной базы для контактов. Я также нашел пример на другом веб-сайте, но тот же вопрос, как добавить собственную базу данных в пример: eshyu.wordpress.com/2010/08/15/ - person Greezer; 24.05.2012
comment
@jens Так что в ICS не имеет значения, использую ли я applyBatch или BulkInsert. Но какая разница в скорости для более ранних версий Android? - person Greezer; 24.05.2012
comment
Ну, у bulkInsert в ICS ограничение пожестче, чем у batchs — т.е. он будет выдавать даже чаще. Вам, вероятно, лучше попытаться выполнить applyBatches разумного размера (максимум 500 операций) в фоновом режиме. Зачем вам нужно заполнять адресную книгу смехотворным количеством контактов? Цели тестирования? - person Jens; 25.05.2012
comment
@Jens Сейчас я использую applyBatch в небольшом количестве, но это очень медленно. Поэтому я проверю ваше предложение по обновлению в больших количествах. Я создаю настраиваемые поля для собственных контактов, поэтому мне нужно добавить/обновить большое количество контактов. Есть ли способ настроить contact2.db напрямую с собственным провайдером или это невозможно (разрешения)? - person Greezer; 25.05.2012
comment
@Greezer - правильно, прямой доступ к базе данных SQLite невозможен. - person Jens; 25.05.2012
comment
@Jens, я попробовал твое решение, и оно стало намного быстрее, чем раньше. Теперь у меня есть некоторые потери времени в моем запросе для получения необходимых данных. Спасибо за совет. Если вы опубликуете это под ответом, я могу отметить ваш ответ как решение. - person Greezer; 29.05.2012