方式 | 实现步骤 | 适用场景 |
---|---|---|
导出到SD卡 | 获取数据库文件路径 通过 File 对象复制数据库到SD卡目录处理读写权限 | 低版本安卓(需动态申请存储权限) |
导出到应用私有目录 | 将数据库复制到getExternalFilesDir() 路径无需申请额外权限 | Android 10+(沙盒存储) |
SharedPreferences备份 | 将关键配置写入XML文件 存入设备存储或云端 | 轻量级配置数据 |
平台 | 实现要点 | 优势 |
---|---|---|
Firebase Realtime Database | 将SQLite数据转换为JSON格式 使用 setValue() 上传数据树监听同步状态 | 实时同步,适合结构化数据 |
Firebase Firestore | 创建NoSQL集合 使用 add() 方法批量上传文档启用离线持久化 | 支持复杂查询,性能更优 |
自建服务器API | 将数据库文件转为Base64字符串 通过Retrofit上传到服务器 服务器端解码存储 | 完全自定义控制 |
方法 | 实现方式 | 限制 |
---|---|---|
Intent分享 | 将数据库文件转为URI 调用 Intent.createChooser() 选择接收应用 | 需目标应用支持该文件类型 |
第三方工具 | 集成ZIP压缩库 通过邮件/社交应用发送备份文件 | 依赖第三方应用生态 |
NFC/蓝牙传输 | 将数据写入NFC标签 通过蓝牙Socket传输 | 仅适合极小数据量 |
加密数据库备份:
Room数据库备份:
// 获取Room数据库文件路径 val dbPath = context.getDatabasePath(MyDatabase.DB_NAME)?.path
增量备份策略:
CHANGES
参数MANAGE_EXTERNAL_STORAGE
权限Q1:如何验证数据库备份是否成功?
A1:可通过以下方式验证:
sqlite3 backup.db "PRAGMA integrity_check;"
Q2:如何处理超过1GB的大型数据库备份?
A2:建议采用分块处理:
val inputStream = FileInputStream(sourceFile) val outputStream = FileOutputStream(destFile) val buffer = ByteArray(1024 1024) // 1MB缓冲区 var length: Int while (inputStream.read(buffer).also { length = it } > 0) { outputStream.write(buffer, 0, length) }