Android sincronización de datos entre usuarios


Tengo una aplicación para Android que mantiene una base de datos SQLite local de diferentes ubicaciones geográficas.

Ahora me gustaría conectar esa base de datos a la "nube" para lograr lo siguiente:

  • Una descarga inicial de todo, cuando la aplicación se instala por primera vez (o bajo petición)

  • Las nuevas ubicaciones que se han agregado localmente deben cargarse en la nube (automáticamente)

  • La base de datos en línea debe revisarse de vez en cuando para nuevos entradas en línea y descargadas a la base de datos local.

Tengo una serie de problemas para lograr esto.

El primero es simplemente cómo hacerlo. Creo que implica ContentProviders y syncProviders, pero no estoy exactamente seguro de cómo. ¿Necesito duplicar mi base de datos SQLite en un ContentProvider, o he cometido un error en el diseño subyacente para usar una base de datos directamente, en lugar de a través de un proveedor de contenido personalizado?

En segundo lugar, la ubicación los registros no se pueden copiar simplemente hacia arriba y hacia abajo de la base de datos en línea, ya que tendrán números de identificación conflictivos. Tengo varias tablas relacionales, como "tags" que relacionan un tag-id con un location-id. Mis identificadores de etiqueta no coincidirán necesariamente con otros identificadores de etiqueta de usuario. Lo mismo con los ID de ubicación. Por lo tanto, tendrá que haber alguna lógica involucrada en la transferencia. ¿Dónde / cómo se debe manejar esto correctamente? Es que el papel de un contentResolver? (no estoy seguro de lo que es realmente)

En tercer lugar, ¿qué sucede en el caso de que 2 usuarios agreguen la misma ubicación al mismo tiempo (tal vez con descripciones y detalles diferentes)? ¿Existe una mejor práctica para fusionar estos registros?

Finalmente, ¿cuál es la forma más sencilla de construir / alojar el componente en línea? Esta parte es toda nueva para mí. ¿Puedo poner la base de datos maestra en una carpeta pública de dropbox o necesito crear una aplicación web php personalizada desde cero? ¿O hay un pre-empaquetado solución que haría esta parte más fácil?

Author: Brent , 2012-05-02

2 answers

Definitivamente debes usar ContentProvider y SyncAdapters. Usted debe:

  • Envuelva la funcionalidad de su base de datos con la interfaz ContentProvider
  • Configurar un SyncService que coincida con la autoridad del ContentProvider
  • En tu especialización SyncAdapter, anularás onPerformSync()
  • Utilice el almacenamiento SharedPreferences para realizar un seguimiento de sus parámetros de sincronización, por ejemplo, tiempo de lastSync, etc.

    final SharedPreferences syncMeta =
                        mContext.getSharedPreferences("sync:" + account.name, 0);
    long lastSyncTime = syncMeta.getLong(LAST_SYNC, 0);
    long lastServerSyncTime = syncMeta.getLong(SERVER_LAST_SYNC, 0);
    
  • Esto puede decirte fácilmente si es la primera sincronización y puedes hacer el manejo inicial aquí

  • Escribirás tu algoritmo aquí para la sincronización, es decir, una vía/dos vías.
  • Me resulta útil grabar marcas de tiempo e ID de base de datos del servidor en sus registros de Android para ayudar con la sincronización. Esto puede ayudarte con tu estrategia de fusión.
  • Utilice el ContentProvider aquí para operaciones de base de datos. Los proveedores de contenido proporcionan una forma uniforme de acceder a sus datos desde su aplicación, así como adaptadores de sincronización. Notificarán al sistema de actualizaciones para que el marco y la programación se sincronicen. También pueden ser útiles como interfaces públicas de sus datos a otras aplicaciones, si decides hacerlo.

  • Además, al usar SyncService, está ahorrando batería. El sistema utilizará cosquillas de red para patear las operaciones de sincronización y su mejor si se agrupan para todas las aplicaciones en lugar de cada aplicación que despierta el sistema

Finalmente,

Hay dos muestras que usted debe mirar. Casi cubren todo lo que expliqué

  1. JumpNote - http://code.google.com/p/jumpnote/source/browse /
  2. SampleSyncAdapter - http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

Ambas aplicaciones utilizan Google App Engine para el componente cloud. Es fácil comenzar con, así que definitivamente explora esas opciones.

 22
Author: Anirudh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 13:13:10

Primero crea una base de datos local en Android. y ur guardar detalles de ubicación detalles. después de guardarlo, envíelo a la base de datos de la nube/servidor.

A continuación ocasionalmente U necesita sincronizar qué base de datos de nube/servidor. por lo tanto, escribe un servicio en Android como take a specific interval y sincronízalo con clound/server DB.

Fusionando para tomar una marca de tiempo en una tabla. y verifique esa marca de tiempo y actualice en consecuencia.

 -1
Author: santhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 14:40:38