Android 备份和从 SD 卡恢复数据库

2023-12-09

我目前正在寻找在我的 Android 应用程序中构建备份功能。然而,在开始实施之前我有点挣扎,因为我不确定正确的方法是什么。

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

  1. 将整个DB文件备份到SD卡
  2. 将 DB 数据导出到 SD 卡上的 XML 文件
  3. 使用Android备份机制将整个DB备份到Google云

现在我想知道你们对这 3 种解决方案有何看法,或者你们知道另一种(也许是更好的方法)以及您认为最好的方法是什么?

以下是我对可能的实施的评论:

  1. 我不知道手机是否没有root,是否可以恢复数据库文件...否则我认为这真的没有任何缺点...
  2. 在 Android 手机上动态处理 XML 文件非常繁重,因此如果可以避免,最好不要这样做
  3. 使用 Android 备份机制,备份功能仅在用户在手机上启用时才可用,并且所有数据都应复制到云端...就我而言,在某些情况下可能会很多...

我期待看到有关此问题的一些意见!

提前致谢!

Kr,

Dirk


我总是使用 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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 备份和从 SD 卡恢复数据库 的相关文章

随机推荐

  • 经典 ASP - 将属性作为 byref 传递

    在经典 ASP 中 我有一个对象 称之为bob 那么它有一个名为name with let and get方法 我有一个函数如下 sub append byref a b a a b end sub 这只是为了更快地向变量添加文本 我也有同
  • 在 Android 中录制声音并读取振幅

    我正在尝试制作一个应用程序 记录声音一秒钟 然后从记录的声音中读取最大幅度 这是我到目前为止所拥有的 但我的应用程序崩溃了 我不明白为什么 这是我的第二个活动 我在按下 记录 按钮后从第一个活动中调用该活动 该应用程序在我的模拟器和手机上崩
  • 如何让 jquery-ui 自动完成退出 iframe?

    是否可以使自动完成 jQueryUI 的建议从一个 iframe 中出来 具有与 select 元素相同的行为 我举一个例子 http jsbin com ehidef 1 事实上 这是可以做到的 尽管一些样式是强制性的 jQueryUI
  • Autoconf 路径中存在空格

    我刚刚将一个 C 项目转换为一个 autotools 项目 并在 configure ac 中编写了几行here 当我的路径应该是 bla bla 时 构建失败并显示 sh home me bla 没有这样的文件或目录 问题是我没有在任何地
  • NSArray 对 ARC 下对象的弱引用 (__unsafe_unretained)

    我需要在 NSArray 中存储对对象的弱引用 以防止保留循环 我不确定要使用的正确语法 这是正确的方法吗 Foo foo1 Foo alloc init Foo foo2 Foo alloc init unsafe unretained
  • WPF 和 CefSharp:性能低下

    我已经成功地用 c winforms 制作了一个个人迷你浏览器应用程序 因为我想要一些更奇特的效果 所以我正在考虑制作一个 WPF 应用程序 因此 我尝试了 wiki 教程并使用浏览器设置了一个简单的 WPF 表单 但注意到它的性能很慢 当
  • C#,如何访问当前线程中在其他线程中创建的内容?

    我正在用 C 编写聊天客户端 服务器应用程序 但我遇到了线程问题 我写了这个简单的代码来显示我的问题 我使用 thread 1 来显示 Form 但它只显示了一秒钟 也许 thread 1 终止并关闭了 Form 但我 IsAlive 说它
  • C4473 结构分配警告

    我目前正在做一项作业 很好奇编译时出现的警告是什么以及如何补救 它会构建 但当我调试时 它会出现错误屏幕 下面是出现的警告 1 gt c 用户 cesteves documents c 编程 库存 库存 inventory cpp 48 警
  • 将广播意图从服务发送到应用程序类

    是否可以将意图从服务发送到应用程序类 不是活动 我不知道在特定时间将运行什么活动 因此我在活动类中添加一个布尔标志 用于检测活动并根据收到的广播发送适当的数据 If your Service是活跃的 那么你的Application类是act
  • EF 6 与 ODP.Net Oracle.ManagedDataAccess,如何对类属性使用非大写字母?

    我正在将 EF 6 与 ODP Net 结合使用Oracle ManagedDataAccess对于我的 ASP Net MVC Web 应用程序 我有以下内容Model called Employee in Model Employee
  • 使用 Facebook iOS SDK 2,我如何喜欢某个页面? - “应用程序必须在白名单中”

    如何使用新的 Facebook iOS SDK 喜欢 某个页面 http github com facebook facebook ios sdk 我目前正在尝试这样做 NSMutableDictionary dict NSMutableD
  • Angular 6 仅需要多个字段中的一个字段反应形式

    我是角度新手 我有一种情况 我只需要表单中 5 个字段中的一个字段 这意味着如果用户至少填写一个字段 那么表单就有效 提前致谢 由于只有当其中一个字段非空时才需要检查整个表单的有效性 因此您可以手动设置有效性 如下所示 if this va
  • R stargazer:不同的小数

    我的 R 中的 stargazer 输出有问题 这是我的原始数据框 Rank p LMax 10 5 1 var1 0 427 24 25 21 8 27 4 31 5 var2 0 228 7 23 11 5 12 2 16 7 观星者创
  • Swift:从字节数据中提取浮点数

    我正在寻找一种健壮且优雅的方法来从数组中提取四个大端字节作为浮点数 我可以通过如下方式获得带有位的 UInt32 let data Byte 0x00 0x00 0x00 0x40 0x86 0x66 0x66 0x00 let dataP
  • 我可以将 Stream> 转换为 Stream 吗? [复制]

    这个问题在这里已经有答案了 这可能吗 伪Java someList 1 2 3 4 Stream
  • 按 DB2 划分的顶级组

    我已经尝试了几个小时 但无法让查询使用 DB2 执行我想要的操作 从表 公司和用户 中 我有每个公司 用户的以下门票数量信息 user company quantity mark nissan 300 tom toyota 50 steve
  • PyPlot ColorMesh 使用错误的颜色映射创建绘图

    我尝试使用 xy 坐标和颜色图以这种方式创建颜色网格图 from matplotlib colors import ListedColormap import numpy as np pylab inline colors ListedCo
  • 在 Windows 10 中的任务计划程序上计划 .py 文件

    我已经尝试将 py 文件转换为 exe 文件 不幸的是 exe 文件会出现问题 我相信这是因为我的代码相当复杂 因此 我尝试使用任务计划程序直接安排我的 py 文件 但每次我这样做然后运行它以查看是否有效 都会弹出一个窗口并询问我如何打开该
  • C 和派生数据类型?

    我知道基本数据类型C char int float 等 但是派生数据类型到底是什么C语言 6 2 5 20 的标准 嗯 草案 万岁免费 covers 派生类型 20 可以从对象 函数和对象构造任意数量的派生类型 不完整类型 如下 数组类型描
  • Android 备份和从 SD 卡恢复数据库

    我目前正在寻找在我的 Android 应用程序中构建备份功能 然而 在开始实施之前我有点挣扎 因为我不确定正确的方法是什么 我在网上发现了一些有趣的文章 因此我想出了三种可能的解决方案 将整个DB文件备份到SD卡 将 DB 数据导出到 SD