ios sqlite core-data

ios - Copia de seguridad periódica de iCloud de la base de datos SQLite



core-data (1)

Voy a responder mi pregunta, ya que terminé yendo por este camino y encontré un bloqueador MASIVO . Hay un error en la API UIDevice.identifierForVendor que hace que se regenere cada vez que se instala una nueva versión de la aplicación. Mira aquí . Esto, por supuesto, descarta usarlo como un identificador de dispositivo. suspiro

Creo que soy SOL con ese enfoque. En cambio, podría generar un GUID en la primera ejecución y usarlo como mi identificador. El problema es que necesito almacenar eso en algún lugar que no esté respaldado en iCloud.

Uf, puedo simplemente darme por vencido aquí y decir que mi aplicación no se puede ejecutar en múltiples dispositivos hasta que se complete la integración de Core Data.

ACTUALIZACIÓN : terminé generando un identificador en la primera ejecución y lo almacené en el llavero (como una entrada local solamente para que no esté respaldado en iCloud).

Permítanme aclarar esto ahora mismo: sí, casi con certeza fue un error no usar Core Data. Sin embargo, era nuevo en el desarrollo de iOS cuando tomé estas decisiones, y no tenía ni idea de que sería así. Además, la aplicación también se ejecuta en Android (eventualmente), por lo que evité las API específicas de la plataforma siempre que sea posible.

Tengo una aplicación de iOS que almacena datos en un archivo de base de datos SQLite local. Los datos almacenados en el archivo son proporcionados por el usuario, por lo que es importante que se mantengan seguros. Tenía planes de "hacer esto más tarde", y más tarde ahora está aquí. Rápidamente me doy cuenta de que no será tan sencillo como esperaba ...

Ahora entiendo que no será posible sincronizar datos a la perfección entre dispositivos, y estoy dispuesto a aceptar esa limitación hasta que logre migrar a Core Data. Sin embargo, mientras tanto, al menos me gustaría que la base de datos SQLite se respalde periódicamente para que los usuarios puedan sentirse seguros al usar la aplicación en un solo dispositivo. Estaba pensando que haría esto:

  • periódicamente (por ejemplo, una vez a la semana) copie el archivo SQLite del almacenamiento local al almacenamiento en la nube, asegurándose así de que esté respaldado
  • cuando se inicia la aplicación, si la tienda local falta o está dañada pero el archivo existe en el almacenamiento en la nube, pregunte al usuario si desea copiarlo

El mayor problema con este enfoque es que el usuario podría ejecutar la aplicación en múltiples dispositivos y, por lo tanto, los datos almacenados en iCloud podrían ser de cualquiera de esos dispositivos, pero solo uno. Para combatir eso, pensé que podría usar un nombre único por dispositivo para el archivo en el almacenamiento en la nube. Yo generaría esto usando UIDevice.identifierForVendor .

Entonces mi lógica de inicio sería:

  1. Determine el nombre único para el archivo de la nube.
  2. ¿Falta el archivo local o está dañado y, de ser así, existe el archivo en la nube?

    2.1. Pregunte al usuario si desea restaurar desde el archivo de la nube. Haga que sea realmente difícil para ellos decir que no porque al hacerlo perderá todos sus datos.

    2.2. Si dicen que sí, copie el archivo de la nube en el almacenamiento de archivos local.

  3. Abra el archivo de la base de datos local.

Y ejecutándose en segundo plano ocasionalmente copiaba el archivo de la base de datos del almacenamiento local al almacenamiento en la nube.

Me gustaría saber si este es un enfoque sensato hasta que realice la integración de Core Data. Además, ¿hay algún "truco" oculto que quizás me estoy perdiendo?

ACTUALIZACIÓN: como señaló @TomHarrington en un comentario, resulta que mi archivo de base de datos ya se encuentra en /Documents , que está respaldado en iTunes y en cualquier cuenta de iCloud. Entonces mi pregunta se transforma en esto:

¿Debo simplemente asegurarme de que mi base de datos tenga un nombre específico del dispositivo para que la aplicación que se ejecuta en otro dispositivo conectado a la misma cuenta de iCloud no la sature?