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:
- La forma más rápida de buscar a través de cadenas almacenadas en la base de datos sqlite
- Insertar datetime en la base de datos sqlite android
- En Android db de SQLite cómo coincidir con valores de columnas particulares que tienen id mismo en varias tablas de una base de datos?
- Cómo acceder a la base de datos SQLite dentro de un archivo zip - android
- SQLite "INSERT OR REPLACE INTO" no funciona
|==========|==========| | _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:
- Las filas existentes se pueden eliminar
- Se pueden añadir nuevas filas
- 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:
- 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
- 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 .
- Orden de índices de columna SQLite crea tabla
- Posible obtener detalles de error específicos de Android SQLiteConstraintException?
- Preferencias compartidas vs base de datos
- Problema en la lectura de la base de datos sqllite
- ¿Qué es más rápido: almacenar datos en una lista o en una base de datos? (Androide)
- Android sqlite - selecciona registros donde el campo es nulo o vacío
- ¿Por qué Androidite SQLite puede almacenar doble valor (java 8 bytes) en la columna de flotación
- Sqlite Comprobar si la tabla está vacía
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.
- ScrollView dos ediciones de edición de EditTexts
- Arquitectura de aplicaciones basadas en gps con permiso de ejecución