Prácticas recomendadas para sincronizar una base de datos SQL con un servidor remoto REST en Android

Tengo un Android ContentProvider personalizado que almacena y recupera datos de una base de datos SQLite.

Supongamos que una de las tablas de DB tiene una columna _ID y una columna NAME y un contenido como este:

 |==========|==========| | _ID | NAME | |==========|==========| | 1 | d1 | | 2 | d2 | | 3 | d3 | | 4 | d4 | |==========|==========| 

Esta base de datos SQLite se mantiene sincronizada con una base de datos remota y se obtienen nuevos datos periódicamente a través de la red. Las posibles operaciones sobre la mesa son las siguientes:

  1. Las filas existentes se pueden eliminar
  2. Se pueden añadir nuevas filas
  3. La columna NAME de las filas existentes se puede modificar

Supongamos ahora que todas las operaciones posibles ocurren de una vez y, después de buscar algunos datos actualizados desde un servidor remoto, el nuevo contenido de esta tabla debe configurarse de la siguiente manera:

 |==========|==========| | _ID | NAME | |==========|==========| | 1 | d7 | | 3 | d3 | | 4 | d6 | | 5 | d5 | |==========|==========| 

Puede haber dos enfoques diferentes para hacer eso:

  1. Consultar la base de datos y comprobar cada filas existentes para ver si necesitan ser actualizados, a continuación, agregue cualquier nueva fila y eliminar las filas que faltan – aunque este método puede ser un poco complicado en caso de que quiera actualizar la base de datos con un enfoque de paginación y no Con una única red de búsqueda
  2. Eliminar toda la tabla con un solo comando DELETE SQL y luego agregar todas las filas recibidas desde el servidor

En Android, actualmente estoy implementando el segundo método con operaciones por lotes para maximizar el rendimiento:

 final ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); // with this URI, the content provider deletes all rows operations.add(ContentProviderOperation.newDelete(Users.CONTENT_URI).build()); final ContentValues values = new ContentValues(); values.put(ID_COLUMN, 1); values.put(NAME_COLUMN, "d7"); values.put(ID_COLUMN, 3); values.put(NAME_COLUMN, "d3"); values.put(ID_COLUMN, 4); values.put(NAME_COLUMN, "d6"); values.put(ID_COLUMN, 5); values.put(NAME_COLUMN, "d5"); operations.add(ContentProviderOperation.newInsert(Users.CONTENT_URI).withValues(values).build()); getApplicationContext().getContentResolver().applyBatch(MyContentProvider.AUTHORITY, operations); 

¿Es este el mejor enfoque, o el método 1 (o algún otro método) sería mejor en términos de rendimiento?

EDIT: por ejemplo, al tomar el enfoque 2, un ContentProvider#bulkInsert que utiliza transacciones de base de datos podría acelerar mucho la operación de inserción por lotes: vea esta pregunta .

La mejor opción requiere la implementación apropiada de la API – cuando debe almacenar algunos db_version (int o timestamp de la última actualización, o lo que sea).

Y durante el servidor de actualización responde con datos, y tipo de operación – agregar, actualizar, eliminar.

  • ¿Cómo acceder a la base de datos sqlite existente en Android Emulator?
  • IOS / Android sincronización con Delphi / C # aplicación de escritorio
  • ¿Cómo puedo abrir el archivo .db. El archivo .db se genera desde eclipse (android) forma DDMS -> File explorer -> data ---> data -> packagename -> base de datos ...?
  • Base de datos SQlite programaticamente convertir en formato de archivo de Excel en Android
  • Cómo restablecer la base de datos SqLite en Android?
  • Insertar datos JSON en la base de datos SQLite en android
  • Android Sqlite SQLiteDiskIOException: error de E / S de disco (código 1290) SQLITE_IOERR_DIR_FSYNC
  • Androide. Excepción de SQLite: no existe ninguna columna _id
  • Expulsión de desencadenamiento de SQLite para eliminar filas
  • ¿Cómo puedo crear una base de datos en android?
  • Cómo comprobar si ya existe un valor en la base de datos en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.