Actualmente estoy trabajando en una aplicación móvil / de escritorio / distribuida con exactamente los mismos requisitos y problemas.
En primer lugar, estos requisitos no son inherentes a las aplicaciones móviles per se, sino a cualquier transacción cliente / servidor desconectada / distribuida (programación paralela, subprocesamiento múltiple, entiendes el punto). Como tales, son, por supuesto, problemas típicos para abordar en aplicaciones móviles.
En general, todo esto se reduce a que tiene un registro de datos potencial que se distribuye a n clientes, que pueden editarlo al mismo tiempo. Lo que necesitas es
- un mecanismo de control / bloqueo de versión adecuado,
- una adecuada gestión de derechos / acceso,
- una estrategia adecuada de sincronización / almacenamiento en caché
Para (1) puede aplicar algunos patrones: hay dos estrategias de bloqueo de uso frecuente: bloqueo sin conexión optimista y bloqueo sin conexión pesimista . Algunos de estos vienen aplicados en diferentes "patrones" de control de versiones, como el Control de concurrencia de conversión múltiple (MVCC), que utiliza un contador (una especie de "marca de tiempo" muy simple) para cada registro de datos, que se actualiza cada vez que se cambia el registro .
(2) y (3) son cuestiones muy amplias en sí mismas, que deben abordarse independientemente de (1). Algunos consejos de mi experiencia:
Utilice una tecnología cliente-servidor que resuelva la mayoría de los problemas por usted. Recomiendo encarecidamente algunas tecnologías web como CouchDb , que maneja (1) a través de Optimistic Offline Locking + MVCC, (2) a través de Web API y (3) a través de caché Http muy bien.
Intente no inventar cosas usted mismo si puede confiar en tecnologías y enfoques probados. Creo que cualquier hora invertida en investigar y comparar tecnologías / patrones existentes es mucho mejor que intentar implementar sus propios sistemas.
Intente utilizar tecnologías homogéneas si es posible. Por "homogéneo" me refiero a las tecnologías que se han construido con los mismos principios en mente, por ejemplo, escenarios de uso de la web 2.0. Un ejemplo: usar un cliente CouchDb y REST adecuado (API web) con una estrategia de almacenamiento en caché local es una mejor opción que usar SQL para aplicaciones móviles.
Recomiendo encarecidamente el uso de MySQL porque es una tecnología que no se hizo explícitamente para tales escenarios de uso. Funciona, pero está mucho mejor con un sistema de base de datos que ya abarca el estilo de comunicación web y concurrencia (como muchas bases de datos NoSQL).
Por cierto, me he conformado con CouchDb con un cliente local personalizado que trabaja en contra de las API de CouchDb, que funciona y escala maravillosamente. Dejé de usar MSQL + (N) Hibernate y pagué un alto precio por no tomar la decisión correcta (es decir, no hacer suficiente investigación) en primer lugar.