用途
该技能用于在 Android 应用内实现“把应用备份成一个 zip 文件,并放到用户自己的 Downloads 文件夹”这一功能,且不需要申请存储权限。它同时负责只保留最新的 N 个归档,避免旧备份无限累积。
主要能力
- 对数据库的预写日志(WAL)执行 checkpoint,然后复制数据库文件,确保备份包含最新提交。
- 在应用自己的缓存目录中组装 zip,再流式写入系统媒体库,避免中途失败留下截断文件。
- 通过向媒体库的 Downloads 集合插入一行记录来创建文件,而不是按路径写入公共目录,因此无需存储权限。
- 支持可选载荷(如媒体缓存数据库、下载文件夹),各自带独立开关和存在性检查。
- 实现保留策略:按添加日期降序排序,删除前 N 个之后的所有归档,只保留最新 N 个。
- 在清理时对名称前缀和后缀做二次校验,避免误删其他应用写入的同名模式文件。
使用方式
资料给出的流程顺序是:
- 先 checkpoint,再复制数据库文件。数据库处于 WAL 模式时,仅复制主文件会丢失最近提交,因此必须先让数据库把日志合并回去。checkpoint 本身是通过 ORM 的原始查询逃生通道执行
PRAGMA wal_checkpoint(full)。 - 在应用缓存目录中组装 zip。可选载荷各自带开关和存在性检查。
- 向媒体库插入一行记录,拿到 URI 后把临时 zip 流式写入。
- 复制成功后执行保留策略,删除旧归档。
代码示例中展示了设置文件写入、数据库 checkpoint 后复制、媒体库插入(含 DISPLAY_NAME、MIME_TYPE、RELATIVE_PATH)以及按 DATE_ADDED DESC 排序后删除多余归档的写法。
适用场景
- Android 应用需要把自身数据导出为 zip 并放到用户 Downloads 文件夹。
- 需要在不申请存储权限的前提下写入公共下载目录。
- 需要定期自动备份并限制归档数量。
- 需要实现备份与恢复,且恢复时要求先 checkpoint、再关闭数据库、再覆盖文件。
限制与注意事项
- 仅适用于 Android。
- 每次读取数据库文件都需要单独 checkpoint;每次写入还需要额外关闭数据库。恢复流程需要 checkpoint、closeDatabase、覆盖文件三步,并在恢复后立即重启进程。
RELATIVE_PATH在 scoped-storage API 级别以下不存在,插入和保留查询都需要相同的版本分支,否则清理会因 provider 拒绝该列而什么都不删。- 保留查询按排序而非比较时间戳来保留最新,排序方向写反会删掉本想保留的归档。
- LIKE 选择不是身份校验,游标循环中需要重新检查名称前缀和后缀。
- 禁用功能时应返回成功而非失败,否则会白白消耗重试预算。
- 验证时需检查每个以文件方式打开数据库的位置是否先 checkpoint,恢复后检查备份前最后一步操作,用设备自带文件管理器打开文件,并临时降低保留数量验证幸存者是最新的。
资料未提供该技能的具体安装命令、收费方式、支持平台版本范围或性能数据。