2011-09-11 39 views
5

我目前正在寻找在我的Android应用程序中建立一个备份功能。然而,即使开始实施它,我也有点挣扎,因为我不确定正确的路要走多远。Android备份和恢复数据库往返SD卡

我发现在网络上的一些有趣的文章,所以我想出了三种可能的解决方案:

  1. 备份整个DB文件到SD卡
  2. 出口的DB-数据上的XML文件SD卡
  3. 中使用Android备份机制来备份整个DB到谷歌云

现在,我想知道你们想想这些解决方案3,或者你知道其他(M还有更好的办法),你眼中的最好方法是什么?

下面是我对可能实现的话:

  1. 我不知道,如果手机没有扎根,它是可以恢复的数据库文件......否则不会有任何真正的下跌我觉得这一点...
  2. 在Android手机上处理XML文件是沉重的,所以如果可以避免,最好不要这样做
  3. 使用Android备份机制,备份功能仅可用如果它是由用户在手机上启用的,并且所有的数据都应该被复制到云端......在我的情况下,在某些情况下可能相当很多...

我期待在这个问题上看到一些输入!

在此先感谢!

KR,

德克

回答

0

我总是用1.)。这是我的一个类,它可以将数据库备份到SD卡。我在这里使用Apache commons-io的FileUtils,如果你不使用那个jar,你需要改变它。另外,在SQLiteOpenHelper类(这里是MySQLiteOpenHelper.getDatabaseName())中需要一个返回数据库文件名称的方法。

你会在你的活动之一调用来自内部的AsyncTask ...

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

这个例子与我在研究中发现的例子类似。我可能会这样。谢谢您的帮助! – dirkvranckaert

+0

这没有提到恢复数据库。 –

+0

@Harald,我明白你的答案。它有助于开发它。但你可以分享你的建议,当我们必须将数据库移动到另一个目录,如卸载时间安装时间等?等待你的积极反馈 –

0

你并不需要有一个根深蒂固的手机,从SD卡上的文件恢复数据库。每个应用程序都可以写入它自己的专用目录,因此您可以复制该文件。至于2,你有没有具体的数字?处理XML相当快,而且由于它是备份/恢复,所以它不会经常发生,用户会期望它需要一些时间,所以它不应该是一个问题。像往常一样,在做出任何决定之前,测量实际需要的时间并考虑您拥有的数据量。

+0

好,但如果1)是可能的,那么为什么要一个甚至花时间创建一些通用的东西备份所有表和他们的数据,而不仅仅是复制整个数据库?这有没有已知的缺点? – dirkvranckaert

+0

这取决于,如果你不需要它,不要写它。也许你需要在其他程序中导入你的数据,而XML/CSV/JSON可能是更好的选择。这是不太可能的,但Android 5.0中的SQLite版本可能与当前格式不兼容等。 –