Guardo algunos datos en mi aplicación iOS directamente en un archivo local .sqlite. Elegí hacer esto en lugar de CoreData porque los datos necesitarán ser compatibles con plataformas que no sean de Apple.Sincronización de un archivo sqlite local a iCloud
Ahora, estoy tratando de encontrar la mejor manera de sincronizar este archivo en iCloud. Sé que no puedes sincronizarlo directamente, por muchas razones. Sé que CoreData es capaz de sincronizar sus bases de datos, pero incluso ignorando que usar un CD esencialmente bloquearía este archivo en las plataformas de Apple (¿creo? Solo he investigado un poco el CD), necesito la sincronización de iCloud para que este archivo funcione TODAS las plataformas compatibles con iCloud, que se supone que incluyen Windows. Tengo que asumir que no habrá compatibilidad para los archivos CoreData en la API de Windows. Planear la mejor manera de lograr esto sería mucho más fácil si Apple nos dijera algo más que "Habrá una API de Windows [eventualmente?]"
Además, eventualmente necesitaré implementar al menos una más servicio de sincronización para soportar plataformas que iCloud no tiene. Sería útil, aunque no obligatorio, si el método que uso para iCloud se puede reutilizar en su mayoría para futuros servicios.
Por estas razones, no creo que CoreData pueda ayudarme con esto. ¿Estoy en lo correcto al pensar esto?
Pasando de allí, necesito idear un algoritmo para esto, o encontrar uno existente o una solución de terceros existente. No he encontrado nada todavía. Sin embargo, he estado dándole vueltas a un par de posibles métodos que pude poner en práctica:
Método 1:
hacer algo similar a la forma en CoreData sincroniza DB SQLite: enviar "registros de transacciones" a iCloud lugar y construir cada archivo local SQLite fuera de esos.
Estoy pensando que cada dispositivo enviaría un archivo de texto (con un nombre único) que enumere todos los comandos sql que ese dispositivo ejecutó, con marcas de tiempo. El dispositivo almacenará qué tan lejos está en cada lista de comandos que ha ejecutado, y continuará desde ese punto cada vez que se actualice el archivo. Si recibiera actualizaciones de varios archivos de registro a la vez, ejecutaría cada comando en el orden de la marca de tiempo.
Las cosas pueden volverse 'interesantes' en cuanto a eficiencia una vez que estos archivos se vuelven grandes, pero parece ser un problema que se puede solucionar.
Método 2:
sincronizar periódicamente una copia de la base de datos de trabajo para iCloud. Tener un campo de marca de tiempo de modificación en cada registro. Cuando se recibe una copia actualizada del DB, consulte todos los registros con marcas de tiempo más recientes que algún tiempo de referencia y actualice el registro en el DB local a partir de los datos nuevos.
veo muchos problemas potenciales con este método:
-Tener a poner en práctica algo más que reconocer supresión de registro.
-El archivo DB podría generar conflictos. Podría ser posible tratar con ellos manejando cada versión de conflicto en orden de fecha y hora.
-La determinación de la fecha para verificar cada actualización podría ser complicada, ya que depende del dispositivo del que proviene la actualización.
Hay un montón de problemas potenciales con el método 2, pero el método 1 parece factible para mí ...
¿Alguien tiene alguna sugerencia sobre cuál podría ser la mejor medida? ¿Alguna idea mejor que mi "Método 1" (o razones por las que no funcionaría)?
Estos son solo para transferir archivos (lo que también hace iCloud). El problema que tengo es duplicar los cambios en un archivo de base de datos que existe en múltiples dispositivos. No puedo simplemente copiar una copia a los otros dispositivos porque la versión en cada dispositivo puede tener cambios únicos. De todos modos, terminé implementando el "Método 1" y está funcionando hasta el momento ... – JDR