Sincronizar un file local sqlite con iCloud

Almacenamos algunos datos en mi aplicación iOS directamente en un file .sqlite local. Elegí hacer esto en lugar de CoreData porque los datos necesitarán ser compatibles con plataforms que no son de Apple.

Ahora, estoy tratando de encontrar la mejor manera de sincronizar este file a través de iCloud. Sé que no puedes sincronizarlo directamente, por muchas razones. Sé que CoreData es capaz de sincronizar sus bases de datos, pero incluso ignorar que el uso de un CD esencialmente bloqueará este file en las plataforms de Apple (creo que solo he mirado un poco en el CD), necesito que la synchronization de iCloud de este file funcione TODAS las plataforms compatibles con iCloud, que se supone que incluyen Windows. Debo suponer que no habrá compatibilidad para los files 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 less un service de synchronization más para soportar plataforms que iCloud no. Sería útil, aunque no obligatorio, si el método que uso para iCloud puede reutilizarse principalmente para services futuros.

Por estos motivos, no creo que CoreData pueda ayudarme con esto. ¿Estoy en lo correcto al pensar esto?

Pasando de allí, necesito diseñar un algorithm para esto, o encontrar una solución existente o una de terceros. No he tropezado con nada todavía. Sin embargo, he estado reflexionando sobre un par de methods posibles que podría implementar:

Método 1:

Haga algo similar a cómo CoreData sincroniza bases de datos sqlite: envíe "loggings de transactions" a iCloud en su lugar y compile cada file sqlite local fuera de esos.

Estoy pensando que cada dispositivo enviará un file de text (único) con todos los commands sql que ejecutó ese dispositivo, con marcas de time. El dispositivo almacenaría qué tan avanzado en cada list de commands que ha ejecutado y continuará desde ese punto cada vez que se actualice el file. Si recibió actualizaciones de varios files de logging a la vez, ejecutaría cada command en order de date y hora.

Las cosas podrían ser "interesantes" en términos de eficiencia una vez que estos files se amplían, pero parece ser un problema solucionable.

Método 2:

Periódicamente sincronice una copy de la database de trabajo con iCloud. Tiene un campo de date y hora de modificación en cada logging. Cuando llega una copy actualizada de la database, consulta todos los loggings con marcas de time más recientes que algún time de reference y actualiza el logging en la database local a partir de los nuevos datos.

Veo muchos posibles problemas con este método:

-Hay que implementar algo más para reconocer la eliminación de loggings.

-El file DB podría generar conflictos. Podría ser posible tratar con ellos manejando cada versión de conflicto en order de date y hora.

-Determinar la date para verificar cada actualización podría ser complicada, ya que depende de qué dispositivo proviene la actualización.

Hay muchos problemas potenciales con el método 2, pero el método 1 me parece factible …

¿Alguien tiene alguna sugerencia sobre cuál podría ser el mejor curso de acción? ¿Alguna mejor idea que mi "Método 1" (o razones por las cuales no funcionaría)?

Pruebe esas dos soluciones de Ray Wenderlich:

Exportar / importar datos por correo: http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

Compartir files con iTunes: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

Lo encontré bastante complejo pero me ayudó mucho.

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 file de database separado que es un subset de datos, es decir, elementos recién modificados. O tal vez otro formatting de file en lugar de sqlite db – XML ​​/ JSON / CSV etc.

Otra alternativa es hacerlo fuera de iCloud, es decir, un simple service web personalizado para la synchronization. Entonces, cada cambio se envía a un server 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 server o presupuesto adecuado para cubrir la ejecución de dicho server. iCloud hará eso por "gratis", pero lo único que realmente hace es transferir files. Una solución personalizada le permite definir su model de synchronization como desee, pero debe desarrollarlo, administrarlo y pagarlo.

He considerado la posibilidad de transferir un file de database a través de iCloud, pero creo que me encontraría con problemas clásicos de synchronization (inicio lento para el usuario) y bases de datos dañadas si la aplicación se ejecuta en varios dispositivos simultáneamente. (iPad / iPhone, por ejemplo).

Así que He tenido que usar el método de loggings de transactions. Realmente es difícil de implementar, pero una vez en su lugar, parece correcto.

Estoy usando la muestra ShanetworkingCoreData de Apple como base para este trabajo. Este enlace requiere una count de desarrollador de Apple.

Encontré una solución mucho mejor de Tim Roadley, pero esto solo funciona para iOS y necesitaba tanto iOS como MacOS.

Rant> ¡El desarrollo de iCloud realmente tiene que ser más fácil y estable! /despotricar