2011-09-08 23 views
10

Acabo de hacer una búsqueda rápida y no surgió nada demasiado relevante, así que aquí va.iOS Implementando actualizaciones de la aplicación. Mantener intactos los datos de usuario cuando se requiere actualización de DB

He lanzado la primera versión de una aplicación. He realizado algunos cambios en SQLite db desde entonces, en la próxima versión necesitaré actualizar la estructura de la base de datos pero retener los datos del usuario.

¿Cuál es el mejor enfoque para esto? Actualmente estoy pensando que en la actualización de la aplicación, nunca reemplazaré el archivo de base de datos del usuario (carpeta de documentos, no en paquete) sino que modificaré su estructura mediante consultas SQL.

Esto implicaría hacer un seguimiento de los cambios realizados en la base de datos desde la versión anterior. Escriba todos estos cambios en consultas SQL y ejecútelos para llevar el DB a la revisión más reciente. También necesitaré mantener un campo en la base de datos para rastrear el número de versión (mantener la línea con la versión de la aplicación para simplificar).

A menos que haya enganches específicos, métodos de delegado que son disparados en la primera ejecución después de una actualización, pondré llamadas para esta lógica en el mismo comienzo de la aplicaciónDelegate, antes de ejecutar cualquier otra cosa.

Al hacer esto, mostraré "Actualización de la aplicación" o algo así para el usuario.

Lo siguiente que sucede es que hay un error en algún punto de la línea y la actualización falla. ¿El DB estará desactualizado y la aplicación no funcionará correctamente ya que espera una versión más nueva?

Debo tomar sobre mí mismo para simplemente eliminar el archivo de base de datos del usuario y reemplazarlo con la nueva versión del paquete de la aplicación. O, ¿debería simplemente probar, probar, probar hasta que todo sea sólido de mi lado y si ocurre un error por parte del usuario es otra cosa, en cuyo caso no puedo hacer nada solo descartar los datos?

Cualquier idea sobre esto sería muy apreciada. :)

Gracias!

+2

Alterar la estructura db al inicio de la aplicación debería estar bien. Solo asegúrate de hacer esto correctamente y evitar que el usuario interactúe con tu aplicación durante este tiempo (lo que no debería demorar demasiado). Como dijo antes, mantenga el número de versión en algún lugar en los valores predeterminados y compare los números de versión al inicio. – tilo

+0

[AT] John Topley, gracias por las correcciones ortográficas. Tonto de mí. ;) @Tilo Eso es lo que estoy haciendo en este momento, parece un buen enfoque. Gracias. :) – conor

Respuesta

5

En primer lugar, el enfoque que está considerando es el correcto. Esto se conoce como migración de base de datos. Siempre que modifique la base de datos en su extremo, debe recopilar los métodos apropiados ALTER TABLE... etc. en una secuencia de comandos de migración.

Luego, la próxima versión de su aplicación debe ejecutar este código una vez (como usted describió) para migrar todos los datos del usuario.

En cuanto a los errores de manejo, es difícil. Estaría muy cansado de descartar los datos del usuario. Mejor sería mostrar un mensaje de error y quizás permitir que el usuario se contacte con un informe de error. Luego, puede lanzar una actualización de su aplicación que, con suerte, puede realizar la migración sin problemas. Pero, idealmente, prueba el proceso lo suficientemente bien como para que no haya ningún problema como este. Por supuesto, todo depende de la complejidad del proceso de migración.

+0

Suena bien, cuando dices coleccionar la ALTER TABLE apropiada ... etc. ¿quieres decir guardar una copia de lo que genera mi aplicación SQLite cuando estoy haciendo cambios? Buena idea. Gracias. – conor

+1

Sí, si está utilizando una aplicación para cambiar el DB, haga una copia de los comandos que genera. Personalmente tendré un grupo de archivos .sql a partir de MyDB_v1.sql que tiene las instrucciones CREATE iniciales y luego crear MyDB_migrate_v1_to_v2.sql tan pronto como empiece a cambiar cosas. Esto contiene cualquier comando para modificar el DB. Una vez que se realiza un lanzamiento, crearé MyDB_migrate_v2_to_v3.sql y lo usaré para mantener futuras migraciones, etc. –

+0

Ok, una cosa más. No he hecho un seguimiento de los cambios desde la versión inicial, que está bien, ya que la aplicación no almacena actualmente los datos del usuario. Puedo anular el DB sin problemas, con una excepción. La aplicación descarga libros/capítulos en la base de datos. Dado el error de wifi en 4.3.3 esto lleva bastante tiempo. Me pregunto si hay alguna manera de poder reemplazar el archivo db real en el lado de los usuarios mientras transfiero los libros descargados al nuevo DB. – conor

Cuestiones relacionadas