La manera más eficiente de insertar 5000 contactos Android

Me doy cuenta de esto ha sido algo tocado en varios lugares, incluyendo aquí en el desbordamiento de la pila, pero estoy buscando cualquier otra solución que la gente podría haber utilizado. Así que con eso en mente …

Estoy desarrollando una aplicación donde un usuario inicialmente puede sincronizar todos sus contactos con una aplicación de escritorio OTA. Esto se realiza a través de una llamada de servicio web que captura un conjunto de 100 contactos del servidor, descarga y analiza la información, inserta los contactos en la base de datos de contacto de Android, confirma la recepción de estos contactos y luego repite los pasos anteriores con el siguiente conjunto de 100 contactos hasta que se complete la sincronización. Este proceso funciona bien cuando un usuario tiene contactos en el orden o 1000-2000, pero un usuario típico de esta aplicación puede tener fácilmente 5000-6000 contactos (con los usuarios de poder tener más de 10000+) en cuyo caso las cosas llevan mucho más tiempo que yo me gustaría Por ejemplo, un conjunto de muestras de aproximadamente 5300 contactos puede tardar unos 13,5 minutos en completarse. No está mal, pero me gustaría que al menos sea tan eficiente como iOS, que se ejecuta unos 8 minutos para el mismo conjunto de datos, si es posible.

He registrado el tiempo que tarda cada paso y, como era de esperar, el cuello de botella parece estar con la inserción de los datos en el contrato DB de Android. Después de fregar la web he encontrado poca ayuda con respecto a la inserción de miles de contactos, pero lo que he encontrado parece caer en estos tres grupos:

1) ContentProviderOperation – la manera recomendada de Google que me dio mi línea de base de 13.5 minutos para 5300 contactos.

2) Insertos a granel – He leído que builkInsert tiende a ser más eficiente que applyBatch, pero cuando traté de implementar esto mismo que realmente tomó 25 minutos para los mismos 5300 contactos. Tengo una sensación mucho de esto es debido al hecho de que necesito insertar la información de RawContact y después excepto el URI resultante para el uso en crear el ContactsContract.Data para el bulkInsert que viene más naturalmente vía el backValueReference en el ContentProviderOperation. Además, miré el código fuente de Android y no tengo la sensación de que bulkInsert es terriblemente eficiente.

3) Creación de un inserto masivo optimizado utilizando el DatabaseUtils.InsertHelper y las transacciones – Desafortunadamente, esto parece orientado hacia aquellas personas que crearon su propio proveedor de contenido porque necesita acceso al DB subyacente como una variable de instancia y todavía tengo que ver cómo que podría hacerse con el DB de contactos nativos.

¿Alguien tiene alguna experiencia con la inserción de 5000 + contactos o cualquier otra idea posible que podría mirar en ayudar a reducir mi tiempo? ¿O debería la ContentProviderOperation ser considerada como optimizada como va a conseguir?

Por desgracia, creo que 1 es la mejor opción. Sospecho que la mayoría de su sobrecarga en comparación con el iPhone está en el proceso cruzado IPC inherente al diseño del proveedor de contenido.

Su análisis de 3 es correcto.

Hay opciones en los dispositivos con raíces para ir alrededor del proveedor de contenido, pero dudo que sea lo que está buscando.

  • ¿Cómo consigue que los contactos se agreguen correctamente al agregarlos de forma programática?
  • Cargar foto de contacto en un rendimiento de vista de lista
  • Cómo hacer copias de seguridad de los contactos o sms en la tarjeta SD como archivo .xml o .csv y restaurarlos más tarde
  • Cómo obtener todos los detalles de un contacto en Android
  • Mostrar el icono de la aplicación si el contacto está asociado con la aplicación en la libreta de direcciones del teléfono
  • Los contactos de Android no muestran mi tipo de cuenta personalizado
  • Cómo recuperar el nombre de contacto y el número de teléfono en Android
  • Consultar contactos con datos parciales
  • Cómo agregar un contacto a un grupo android
  • Android recibe la imagen de contacto del registro de llamadas
  • acceder a los contactos de la tarjeta SIM en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.