上一篇
安卓开发数据库备份
- 行业动态
- 2025-04-22
- 3
安卓数据库备份基础
安卓应用常用SQLite作为本地数据库,备份核心是将.db
文件复制到安全位置(如内部存储、SD卡或云端),需注意不同Android版本的存储权限限制。
本地备份方案
直接复制数据库文件
步骤 | 说明 |
---|---|
获取数据库路径 | Context.getDatabasePath(String dbName).getPath() |
创建目标文件 | 如/sdcard/backup/mydb.db |
复制文件 | 使用FileInputStream 和FileOutputStream |
代码示例:
File dbFile = context.getDatabasePath("mydb.db"); File backupFile = new File(Environment.getExternalStorageDirectory(), "backup/mydb.db"); try (InputStream in = new FileInputStream(dbFile); OutputStream out = new FileOutputStream(backupFile)) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); }
云端备份方案
上传至服务器/云存储
需将数据库文件转为字节流,通过HTTP/HTTPS上传,推荐使用AsyncTask
或WorkManager
处理后台任务。
关键步骤:
- 将
.db
文件压缩为ZIP(可选) - 使用
MultipartBody
提交文件 - 处理网络异常和超时
数据库恢复流程
- 检查备份文件完整性(MD5校验)
- 停止数据库连接(
SQLiteDatabase.close()
) - 替换原数据库文件
- 重启应用重建数据库连接
权限与兼容性处理
Android版本 | 存储权限 | 解决方案 |
---|---|---|
Android 10+ | 分区存储 | 使用MediaStore API或请求MANAGE_EXTERNAL_STORAGE 权限 |
Android 11+ | 更严格限制 | 建议使用应用专属目录(getExternalFilesDir() ) |
注意事项
- 数据库锁定问题:操作前调用
database.close()
释放锁 - 大文件处理:分块读写避免OOM
- 加密需求:对敏感数据可先用AES加密再备份
- 版本兼容:Android 6.0+需动态申请WRITE_EXTERNAL_STORAGE权限
相关问题与解答
问题1:数据库版本升级后如何兼容备份?
解答:
每次升级DATABASE_VERSION
时,在SQLiteOpenHelper
的onUpgrade()
方法中保留向前兼容逻辑,备份时需同时记录数据库版本号,恢复时根据版本差异执行迁移操作。
问题2:如何备份到Google Drive?
解答:
- 使用Google Drive API创建
DriveResourceClient
- 将数据库文件转为
Bitmap
或PDF(不可直接上传.db文件) - 调用
DriveApi.newDriveContents()
- 通过
driveResourceClient.createFile()
上传
需在Google Cloud Console启用Drive API并配置OAuth 2.0认证