27

Tengo una aplicación de Android que mantiene una base de datos SQLite local de diferentes ubicaciones geográficas.Android sincronización de datos entre los usuarios

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

  • una descarga inicial de todo, cuando se instala la primera aplicación (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 verificarse ocasionalmente para nuevas entradas en línea y descargarse a la base de datos local.

Tengo un número de problemas para lograr esto.

La primera es simplemente cómo hacerlo. Creo que implica contentProviders y syncProviders, pero no estoy exactamente seguro de cómo. ¿Debo duplicar mi base de datos SQLite en un contentProvider, o me he equivocado en el diseño subyacente para usar una base de datos directamente, en lugar de hacerlo a través de un proveedor de contenido personalizado?

En segundo lugar, los registros de ubicación no se pueden copiar simplemente hacia arriba y hacia abajo desde la base de datos en línea, ya que tendrán números de identificación conflictivos. Tengo varias tablas relacionales, como "etiquetas" que relacionan una ID de etiqueta con una ID de ubicación. Mis identificadores de etiquetas no necesariamente coincidirán con los identificadores de etiquetas de otros usuarios. Lo mismo con los identificadores de ubicación. Entonces será necesario que haya cierta lógica involucrada en la transferencia. ¿Dónde/cómo debe manejarse adecuadamente? ¿Es esa la función 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 (quizás 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 nueva para mí. ¿Puedo poner la base de datos maestra en una carpeta pública de Dropbox, o necesito crear una aplicación web de php personalizada desde cero? ¿O hay una solución preempaquetada que facilitaría esta parte?

+0

Veo que la pregunta fue hecha hace 3 años y tiene una respuesta aceptada. ¿Puede por favor detallar qué más información necesita para la recompensa? – RocketRandom

Respuesta

22

Definitivamente debe usar ContentProvider y SyncAdapters. Usted debe:

  • envolver su funcionalidad de base de datos con la interfaz ContentProvider
  • instalación de un SyncService juego la autoridad del ContentProvider
  • En su SyncAdapter especialización, podrá anular onPerformSync()
  • Uso SharedPreferences de almacenamiento para mantener seguimiento de sus parámetros de sincronización, por ejemplo lastSync time, 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 le puede decir fácilmente si es la primera sincronización y se puede hacer el manejo inicial aquí

  • Va a escribir su algoritmo aquí para sincronización es decir una forma/bidireccional.
  • Encuentro útil registrar las marcas de tiempo y la ID de la base de datos del servidor en sus registros de Android para ayudar con la sincronización. Esto puede ayudarte con tu estrategia de combinación.
  • Utilice aquí el ContentProvider para las operaciones de base de datos. ContentProviders proporciona una forma uniforme de acceder a sus datos desde su aplicación, así como sincronizar adaptadores. Notificarán al sistema de actualizaciones para que el marco y la sincronización de programación. También pueden ser útiles como interfaces públicas de tus datos para otras aplicaciones si decides hacerlo.

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

Por último,

Hay dos muestras que usted debe buscar a. Ellos prácticamente cubren todo lo que explicó

  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 de la nube. Es fácil comenzar, así que definitivamente explora esas opciones.

+0

Gracias por las muestras. ¿Conoces algún tutorial en línea que cubra esto? (el código es excelente, pero tardará un tiempo en abrirse paso), y la página de developer.android.com no dice mucho. – Brent

+0

Veo una serie de 2 partes aquí - http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/. Parte 2 es más relevante. Ese tutorial usa cuentas personalizadas. Solo puede confiar en las cuentas com.google. – Anirudh

-1

Primero crea una base de datos local en Android. y guardando los detalles de detalles de la ubicación. después de guardarlo enviar a la nube/servidor DB.

A veces ocasionalmente necesitamos sincronizar qué nube/servidor DB. así que escriba un servicio en Android como tomar un intervalo específico y sincronizar con clound/server DB.

fusionando, así que tome una marca de tiempo en una tabla. y verifique esa marca de tiempo y actualice en consecuencia.

Cuestiones relacionadas