Cómo utilizar CALLER_IS_SYNCADAPTER correctamente

de alguna manera no entiendo el concepto de trabajo del parámetro de consulta CALLER_IS_SYNCADAPTER. Su valor predeterminado es false, si se establece, el indicador DIRTY no se establece automáticamente. Entonces, ¿qué significa realmente? De acuerdo con mi entendimiento, cada cambio en un contacto resulta en establecer el indicador sucio en 1. Después de que un adaptador de sincronización terminó el trabajo, utilizando insert / update / delete con el CALLER_IS_SYNCADAPTER los registros insertados / actualizados y eliminados deberían tener un indicador sucio de 0 , ¿está bien?

Sin embargo, si invoco consultas con ese parámetro opcional, las entradas permanecen con el indicador 1.

¿Hay algo más que tengo que hacer, o es mi entender cómo debería funcionar mal? ¿O hay algo que decirle al sistema que la sincronización se ha terminado correctamente para establecer las banderas?

¿Alguien tiene una muestra o algunos consejos para leer más?

CALLER_IS_SYNCADAPTER no afecta necesariamente a lo que se almacena en la fila de la base de datos, depende del comando realizado. No debe tener un efecto en las consultas. No lo utilice desde una aplicación de usuario en el dispositivo.

Ahora … ¿Por qué existe?

Se proporciona para ayudar con la integración de notifyChange () / ContentObservers / ContentResolver / Syncadapter. Hay dos casos de uso para cambiar una fila en la base de datos.

  1. El usuario local edita desde una aplicación.
  2. Los cambios provienen de la red (a través de SyncAdapter)

Cualquier cambio requiere que la interfaz de usuario se actualice, si está en pantalla. Por ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) tanto, se ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) . Esto actualiza ContentObservers y les dice que vayan a buscar los datos más recientes de la base de datos ContentProvider. Ese último parámetro en la llamada es tu pista.

ContentResolver es un ContentObserver. Cuando ve el cambio de base de datos, considera la puesta en marcha de su SyncAdapter para empujar el cambio hasta la red. Esto es grande en el caso 1. En el caso 2, es redundante. El cambio vino de la red, no hay ninguna razón para iniciar una sincronización para enviar el cambio de nuevo.

Calendar.CALLER_IS_SYNCADAPTER es una señal utilizada en la actualización () realizada por SyncAdapter. Cuando es verdad, ContentProvider establece syncToNetwork como false, asegurando que una segunda sincronización redundante no se realiza

Un segundo ejemplo es como el veljko mencionado. La forma más limpia de eliminar una cosa del servidor es establecer el indicador de eliminación y, a continuación, realizar una sincronización. Cuando el indicador CALLER_IS_SYNCADAPTER es falso (aplicación de usuario), una llamada a eliminar () establece el indicador. Cuando el indicador es verdadero (la sincronización está sucediendo), una llamada a delete () empuja la eliminación hasta el servidor y elimina la fila del DB local. Sólo hay una llamada delete (), este indicador permite al ContentProvider saber qué tarea se supone que debe hacer.

Usted puede agregar a su Uri existente:

 myUri=calendarUri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build(); 

Aquí es de Javadoc:

/ ** * Un parámetro opcional de inserción, actualización o eliminación de URI que permite a la persona que llama * especificar que es un adaptador de sincronización. El valor predeterminado es false. Si es true * el indicador sucio no se establece automáticamente y el parámetro "syncToNetwork" * se establece en falso al llamar * {@link ContentResolver # notifyChange (android.net.Uri, android.database.ContentObserver, boolean)}. * /

.

La invocación de resolver.delete (…), no elimina inmediatamente una fila de contactos sin procesar. En su lugar, establece el indicador DELETED en el contacto bruto y elimina el contacto bruto de su contacto agregado. El adaptador de sincronización elimina el contacto bruto del servidor y finaliza la eliminación del lado del teléfono llamando a resolver.delete (…) de nuevo y pasando el parámetro de consulta CALLER_IS_SYNCADAPTER.

  • Administrador de cuentas: la aplicación de Android no aparece en la pestaña Cuentas de Configuración,
  • Cómo manejar llamadas REST, persistencia de datos, sincronización y observación de ContentProvider
  • Detener el adaptador de sincronización para sincronizar inicialmente cuando se utiliza addPeriodicSync
  • Se pierde la aplicación Android de SyncAdapter
  • Utilice SyncAdapter para sincronizar con * local * datos de aplicaciones de Gmail y Facebook
  • Caso de uso de Android SyncAdapter
  • Eliminar la base de datos cuando se quita una cuenta
  • AccountManager.addAccountExplicitamente devuelve false en Algunos teléfonos Android
  • SyncAdapter: Cuenta creada, requestSync OK, pero setSyncAutomatically no funciona
  • Crear contacto con el tipo de cuenta personalizado creado mediante el adaptador de sincronización
  • Syncadapter sin conexión a Internet
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.