2011-11-15 12 views
18

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)?

Respuesta

3

juzgar a los dos soluciones de Ray Wenderlich:

Exportación/Importación de datos a través de correo electrónico: http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

uso compartido de archivos con iTunes: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

Me pareció bastante complejo, pero me ayudó mucho .

+2

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

1

Tanto el método 1 como el método 2 parecen factibles. Tal vez una combinación de los dos, de hecho, use iCloud para enviar un archivo de base de datos separado que sea un subconjunto de datos, es decir, solo elementos modificados. O tal vez otro formato de archivo en lugar de sqlite db - XML ​​/ JSON/CSV, etc.

Otra alternativa es hacerlo fuera de iCloud, es decir, un simple servicio web personalizado para la sincronización. Por lo tanto, cada cambio se envía a un servidor central a través de JSON/XML a través de HTTP, y luego otros dispositivos obtienen actualizaciones de eso.

Obviamente, depende de cuántos datos y cuántos dispositivos desea sincronizar, y si tiene acceso a un servidor o presupuesto adecuado para cubrir la ejecución de dicho servidor. iCloud lo hará por "gratis", pero lo único que hace es transferir archivos. Una solución personalizada le permite definir su modelo de sincronización como lo desee, pero debe desarrollarlo, administrarlo y pagarlo.

0

He considerado la posibilidad de transferir un archivo de base de datos a través de iCloud pero creo que me encontraría con problemas clásicos de sincronización (inicio lento para el usuario) y bases de datos corruptas si la aplicación se ejecuta en múltiples dispositivos simultáneamente. (iPad/iPhone por ejemplo).

Sooo. Tuve que usar el método de registros de transacciones. Realmente es difícil de implementar, pero una vez en su lugar, parece estar bien.

Estoy utilizando la muestra de SharedCoreData de Apple como base para este trabajo. Este enlace requiere una cuenta de desarrollador de Apple.

Encontré una solución mucho mejor desde Tim Roadley, pero esto solo funciona para IOS y necesitaba IOS y MacOS.

rant> ¡el desarrollo de iCloud realmente tiene que ser más fácil y más estable!/rant

Cuestiones relacionadas