方式 | 实现原理 | 适用场景 |
---|---|---|
手动备份 | 通过代码或用户操作导出数据库文件 | 低频备份、用户主动触发 |
自动定时备份 | 结合 WorkManager 或 AlarmManager 定期执行备份任务 | 高频备份、后台静默执行 |
第三方库备份 | 使用 Room、GreenDao 等 ORM 框架的内置备份功能 | 复杂数据库结构、快速集成 |
云存储备份 | 将数据库文件上传至云端(如 Firebase、AWS) | 跨设备同步、长期存储 |
File dbFile = new File("/data/data/" + getPackageName() + "/databases/my_database.db");
File backupFile = new File(Environment.getExternalStorageDirectory(), "backup/my_database.db"); try (InputStream in = new FileInputStream(dbFile); OutputStream out = new FileOutputStream(backupFile)) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); }
MANAGE_EXTERNAL_STORAGE
或使用 Scoped Storage API。val backupWork = PeriodicWorkRequest.Builder(DatabaseBackupWorker::class.java, 1, TimeUnit.DAYS) .setConstraints(Constraints.NONE) .build() WorkManager.getInstance(context).enqueue(backupWork)
Worker 类示例:
public class DatabaseBackupWorker extends Worker { @Override public Result doWork() { // 调用手动备份逻辑 backupDatabase(); return Result.success(); } }
SQLiteDatabase db = SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READWRITE); db.close();
File backupFile = new File(backupPath); if (backupFile.exists()) { FileUtils.copy(backupFile, dbFile); // 使用第三方工具类复制文件 }
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
库名 | 优点 | 缺点 |
---|---|---|
Room | 内置备份API、与架构组件无缝集成 | 仅支持本地备份,需自行扩展云存储 |
GreenDao | 高性能、灵活自定义备份逻辑 | 学习成本较高,需手动管理线程 |
ORMLite | 轻量级、支持多种数据库类型 | 功能相对简单,需二次开发 |
解答:
增量备份需记录上次备份后的数据变更,可通过以下步骤实现:
created_at
或 updated_at
字段。SELECT FROM table_name WHERE updated_at > ?
解答: