2010-06-02 26 views
7

Tengo una aplicación Core Data que terminará siendo una aplicación universal para iPhone/iPad.Sincronización en la nube entre la aplicación para iPad/iPhone

Me gustaría implementar la sincronización en la nube para que un iPhone y un iPad que ejecuten la aplicación puedan compartir datos. Estoy planeando usar el recently released Dropbox API. ¿Alguien tiene alguna idea sobre la mejor manera de hacer esto? La API de Dropbox permite que las aplicaciones almacenen archivos en la nube. Lo que estaba pensando era almacenar originalmente la base de datos (sqlite) para la aplicación en la nube y luego descargar esa base de datos, pero luego me di cuenta de que usar ese método dificultaría la fusión de los cambios (en lugar de reemplazar toda la base de datos).

Cualquier pensamiento es apreciado. Gracias.

Respuesta

5

Si puede salirse con la suya, la forma más fácil de hacer la sincronización (por el momento) tener tres copias de sus datos localmente: la copia que cargó por última vez ("anterior"), la copia producida por cambios locales ("mina") y la copia ahora descargada del servidor ("theirs").

A continuación, ordenar todos los registros en los tres archivos y caminar a través de ellos uno por uno:

  • si la mía == edad, utilizar el suyo
  • más si los viejos suyos ==, el uso de minas
  • else tienes un conflicto; hacer algo al respecto (por ejemplo, siempre use el mío, también conocido como "último escritor gana")

Tenga en cuenta que "mío" o "de ellos" o "viejo" podría no existir. Las reglas anteriores aún se aplican en ese caso; si el resultado que elige es "no existe", querrá eliminar el registro en el archivo de salida.

Finalmente, cargue el archivo resultante de vuelta al servidor para que sea la base de datos "suya" para el siguiente tipo. Luego, copie el nuevo archivo en sus bases de datos "antiguas" y "antiguas" locales.

(Hay más algoritmos eficientes en espacio distintos de los anteriores ... pero no hay ningún más fáciles :) y espacio en disco es bastante barato hoy en día, sobre todo si comprime los archivos.)

+0

¿hay alguna trampa? – Yoo

+0

Siempre hay una trampa :) – apenwarr

0

Puede consultar GameKit para compartir datos. De lo contrario, parece que solo necesitará administrar la sincronización con un servidor de archivos intermedio.

+0

estaba considerando esa opción, pero ¿cuál es la forma más fácil de fusionar los cambios entre 2 bases de datos de Core Data? – indragie

+0

El iPhone no admite los Servicios de sincronización disponibles para OS X (http://developer.apple.com/iphone/library/technotes/tn2009/tn2152.html # SECSYNCING), por lo que deberá escribir sus propias rutinas. Observe cómo agregar una marca de tiempo a los registros y permitir que el usuario decida la política de cómo se realiza la sincronización (por ejemplo, se envía el registro de marca de tiempo más reciente a todos los demás dispositivos). –

1

Es posible que desee utilizar un método diferente para la sincronización. ¿Cuál es el tipo de datos con los que tratará?

He tenido mucho éxito utilizando un raíl liviano.

+0

Solo algunos objetos de modelo simple (que consisten básicamente en NSStrings, NSArrays, etc.) – indragie

+2

Si te sientes cómodo con los rieles, echa un vistazo al proyecto ObjectiveResource. –

+0

Lamento que solo tenga un voto alternativo para dar el comentario de Frank Schmitt. – corprew

0

Probablemente desee exportar los datos a algún formato que no sea el formato nativo sqlite. Si estuviera diseñando algo como esto, creo que JSON sería probablemente mi formato de elección.

No he mirado la API de Dropbox, pero admiten cargar y descargar diferencias de archivos, en lugar de todo el archivo, ¿verdad? Dependiendo de cómo funciona la API, quizás hacer que su aplicación comprenda su formato "diff" y trabajar con eso podría ser más fácil ...

+0

Convertir los datos a JSON no sería un problema. El problema que todavía tengo es cómo fusionar los cambios entre las dos bibliotecas de manera efectiva. – indragie

+0

La sincronización es un problema generalmente difícil, desafortunadamente. Si desea sincronizar en ambas direcciones, deberá mantener algún tipo de recuento de modificaciones para cada registro, y tomar la "última" versión al fusionarse. El verdadero desafío es manejar los conflictos de una manera razonable. –

+0

Eso es lo que asumí, necesito encontrar una manera de resolver conflictos. Un escenario específico en el que estoy pensando es que si el dispositivo A tenía un registro pero luego se eliminó y el dispositivo B tiene ese registro pero no se elimina, no me gustaría que el dispositivo A vuelva a obtener esa grabación cuando se sincronice ... esto es difícil – indragie

Cuestiones relacionadas