2011-09-11 14 views
5

Actualmente estoy buscando crear una función de copia de seguridad en mi aplicación Android. Sin embargo, estoy luchando un poco incluso antes de comenzar a implementarlo porque no estoy seguro de cuál es la forma correcta de hacerlo.Copia de seguridad de Android y restaurar la base de datos desde y hacia la tarjeta SD

he encontrado algunos artículos interesantes en la red y por lo que me ocurrió con tres soluciones posibles:

  1. copia de seguridad de todo el archivo de base de datos a la tarjeta SD
  2. exportación DB-datos a un archivo XML en la tarjeta SD
  3. uso del mecanismo de copia de seguridad de Android para copia de seguridad de toda la base de datos a la nube de Google

Ahora me preguntaba lo que ustedes piensan acerca de estas 3 soluciones, o conoce a otra (m aybe una manera aún mejor de ir) y ¿cuál es en tus ojos la mejor manera de ir?

Aquí están mis observaciones sobre las posibles implementaciones:

  1. No sé si el teléfono no está arraigado que es posible restaurar el archivo de base de datos ... De lo contrario, en realidad no hay ningún abajo lados para esto creo ...
  2. Manejar archivos XML sobre la marcha en teléfonos Android es pesado, así que si se puede evitar es mejor no hacerlo así
  3. Usando el mecanismo de copia de seguridad de Android la función de copia de seguridad solo está disponible si está habilitado por el usuario en el teléfono, y todos los datos deben ser copiados a la nube ... que en mi caso puede ser en algunos casos bastante lote ...

¡Estoy deseando ver algo sobre este tema!

¡Gracias de antemano!

Kr,

Dirk

Respuesta

0

Siempre uso 1.). Aquí hay una clase de la mía que hace copia de seguridad de una tarjeta DB a SD. Estoy usando FileUtils de Apache commons-io aquí, necesitas cambiar eso si no usas ese jar. Además, hay una necesidad de un método en su clase SQLiteOpenHelper (aquí MySQLiteOpenHelper.getDatabaseName()) que devuelve el nombre de su archivo de base de datos.

Va a llamar a que desde dentro de una AsyncTask en una de sus actividades ...

public class MyDatabaseTools { 
    private String appName = ""; 
    private String packageName = ""; 

    public boolean backup() { 
    boolean rc = false; 

    boolean writeable = isSDCardWriteable(); 
    if (writeable) { 
     File file = new File(Environment.getDataDirectory() + "/data/" + packageName + "/databases/" + MySQLiteOpenHelper.getDatabaseName()); 

     File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup"); 
     if (!fileBackupDir.exists()) { 
     fileBackupDir.mkdirs(); 
     } 

     if (file.exists()) { 
     File fileBackup = new File(fileBackupDir, MySQLiteOpenHelper.getDatabaseName()); 
     try { 
      fileBackup.createNewFile(); 
      FileUtils.copyFile(file, fileBackup); 
      rc = true; 
     } catch (IOException ioException) { 
      // 
     } catch (Exception exception) { 
      // 
     } 
     } 
    } 

    return rc; 
    } 

    private boolean isSDCardWriteable() { 
    boolean rc = false; 

    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     rc = true; 
    } 

    return rc; 
    } 

    public MyDatabaseTools(final Context context, final String appName) { 
     this.appName = appName; 
     packageName = context.getPackageName(); 
    } 
} 
+0

El ejemplo es similar a los que encontré durante mi investigación. Probablemente por este camino. ¡Gracias por la ayuda! – dirkvranckaert

+0

Esto no menciona la restauración de la base de datos. –

+0

@Harald, entiendo tu respuesta. es útil para su desarrollo. pero ¿puedes compartir tu sugerencia para cuando tengamos que mover el archivo db a otro directorio como el tiempo de instalación de la hora de desinstalación, etc.? esperando tus comentarios positivos –

0

Usted no necesita tener un teléfono raíces para restaurar la base de datos de un archivo en la tarjeta SD. Cada aplicación puede escribir en sus propios directorios privados, por lo que puede copiar el archivo. En cuanto a 2, ¿tiene algún número concreto? Manejar XML es bastante rápido, y dado que es una copia de seguridad/restauración, no ocurre con demasiada frecuencia y los usuarios esperarían que lleve algo de tiempo, por lo que no debería ser un problema. Como de costumbre, mida el tiempo real que toma y considere la cantidad de datos que tiene, antes de tomar cualquier decisión.

+0

bien, pero si 1) es posible, entonces ¿por qué debería uno incluso pasar tiempo en la creación de algunas cosas genéricas de copia de seguridad y todas las tablas sus datos y no solo copiar toda la base de datos? ¿Tiene eso alguna desventaja conocida? – dirkvranckaert

+0

Depende, si no lo necesita, no lo escriba. Tal vez necesite importar sus datos en otros programas, y XML/CSV/JSON podría ser una mejor opción. Es bastante improbable, pero la versión de SQLite en Android 5.0 podría no ser compatible con el formato actual, etc. –

Cuestiones relacionadas