欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

在这里插入图片描述

📌 概述

备份恢复模块用于数据的备份和恢复。这个模块支持自动备份和手动备份,用户可以定期备份应用数据以防止数据丢失。通过Cordova框架,我们能够在Web层实现备份管理界面,同时利用OpenHarmony的文件系统能力存储备份文件。

备份恢复模块采用了增量备份策略,只备份自上次备份以来的新增或修改的数据,节省存储空间。同时提供了备份文件的加密功能,保护用户的隐私。

🔗 完整流程

自动备份流程:应用在后台定期执行自动备份,通常每天一次。备份时,应用会将所有数据库表的内容导出为JSON格式,并保存到本地存储。备份文件会自动压缩以节省空间。

手动备份流程:用户可以随时点击"立即备份"按钮执行手动备份。备份完成后,应用会显示备份文件的大小和保存位置。

恢复流程:用户可以选择一个备份文件进行恢复。应用会先验证备份文件的完整性,然后将备份数据导入到数据库中,覆盖现有数据。恢复完成后,应用会重新启动。

🔧 Web代码实现

// 执行备份
async function performBackup() {
    try {
        showLoading('正在备份数据...');
        
        const allData = {
            diaries: await db.getAllDiaries(),
            pets: await db.getAllPets(),
            categories: await db.getAllCategories(),
            tags: await db.getAllTags(),
            healthRecords: await db.getAllHealthRecords(),
            vaccinations: await db.getAllVaccinations(),
            timestamp: new Date().toISOString()
        };
        
        const backupData = JSON.stringify(allData, null, 2);
        const backupSize = new Blob([backupData]).size;
        
        // 调用原生备份功能
        const backupPath = await performNativeBackup(backupData);
        
        showSuccess(`备份成功,文件大小: ${formatFileSize(backupSize)}`);
        return backupPath;
    } catch (error) {
        showError('备份失败: ' + error.message);
        return null;
    }
}

// 加载备份列表
async function loadBackups() {
    try {
        const backups = await getNativeBackupList();
        return backups.sort((a, b) => new Date(b.date) - new Date(a.date));
    } catch (error) {
        console.error('加载备份列表失败:', error);
        return [];
    }
}

// 恢复备份
async function restoreBackup(backupPath) {
    const confirmed = confirm('确定要恢复此备份吗?当前数据将被覆盖。');
    if (!confirmed) return;
    
    try {
        showLoading('正在恢复数据...');
        
        const backupData = await readBackupFile(backupPath);
        const data = JSON.parse(backupData);
        
        // 清空现有数据
        await db.clearAllData();
        
        // 导入备份数据
        await Promise.all([
            db.importDiaries(data.diaries),
            db.importPets(data.pets),
            db.importCategories(data.categories),
            db.importTags(data.tags),
            db.importHealthRecords(data.healthRecords),
            db.importVaccinations(data.vaccinations)
        ]);
        
        showSuccess('数据恢复成功');
        location.reload();
    } catch (error) {
        showError('恢复失败: ' + error.message);
    }
}

这些函数处理备份的执行和恢复。performBackup函数收集所有数据并调用原生备份功能。restoreBackup函数读取备份文件并导入数据。

// 渲染备份恢复页面
async function renderBackup() {
    const backups = await loadBackups();
    
    const html = `
        <div class="backup-container">
            <div class="backup-header">
                <h1>备份恢复</h1>
                <button class="btn-primary" onclick="performBackupNow()">立即备份</button>
            </div>
            
            <div class="backup-settings">
                <h2>自动备份设置</h2>
                <div class="settings-form">
                    <div class="form-group">
                        <label>
                            <input type="checkbox" id="auto-backup-enabled" checked>
                            启用自动备份
                        </label>
                    </div>
                    <div class="form-group">
                        <label>备份频率</label>
                        <select id="backup-frequency">
                            <option value="daily">每天</option>
                            <option value="weekly">每周</option>
                            <option value="monthly">每月</option>
                        </select>
                    </div>
                    <button class="btn-primary" onclick="saveBackupSettings()">保存设置</button>
                </div>
            </div>
            
            <div class="backup-list">
                <h2>备份文件</h2>
                ${backups.length > 0 ? `
                    <table class="backup-table">
                        <thead>
                            <tr>
                                <th>备份时间</th>
                                <th>文件大小</th>
                                <th>操作</th>
                            </tr>
                        </thead>
                        <tbody>
                            ${backups.map(backup => ` <tr> <td>${formatDate(backup.date)}</td> <td>${formatFileSize(backup.size)}</td> <td> <button class="btn-small" onclick="restoreBackup('${backup.path}')">恢复</button> <button class="btn-small btn-danger" onclick="deleteBackup('${backup.path}')">删除</button> </td> </tr> `).join('')}
                        </tbody>
                    </table>
                ` : '<p class="empty-state">还没有备份文件</p>'}
            </div>
        </div>
    `;
    
    document.getElementById('page-container').innerHTML = html;
}

// 立即备份
async function performBackupNow() {
    const backupPath = await performBackup();
    if (backupPath) {
        renderBackup();
    }
}

这个渲染函数生成了备份恢复界面,包括自动备份设置和备份文件列表。

🔌 原生代码实现

// BackupPlugin.ets - 备份恢复原生插件
import { fileIo } from '@kit.BasicServicesKit';
import { zlib } from '@kit.BasicServicesKit';

@Entry
@Component
struct BackupPlugin {
    // 执行备份
    performBackup(backupData: string, callback: (path: string) => void): void {
        try {
            const backupPath = `/data/backups/backup_${Date.now()}.json.gz`;
            
            // 压缩备份数据
            const compressed = zlib.compress(backupData);
            
            const file = fileIo.openSync(backupPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE);
            fileIo.writeSync(file.fd, compressed);
            fileIo.closeSync(file.fd);
            
            callback(backupPath);
        } catch (error) {
            console.error('[BackupPlugin] 备份失败:', error);
            callback('');
        }
    }
    
    // 获取备份列表
    getBackupList(callback: (backups: string) => void): void {
        try {
            const backupDir = '/data/backups';
            const files = fileIo.listFileSync(backupDir);
            
            const backups = files.map(file => {
                const stat = fileIo.statSync(`${backupDir}/${file}`);
                return {
                    name: file,
                    path: `${backupDir}/${file}`,
                    size: stat.size,
                    date: new Date(stat.mtime).toISOString()
                };
            });
            
            callback(JSON.stringify(backups));
        } catch (error) {
            console.error('[BackupPlugin] 获取备份列表失败:', error);
            callback(JSON.stringify([]));
        }
    }
    
    build() {
        Column() {
            Web({ src: 'resource://rawfile/www/index.html', controller: new WebviewController() })
        }
    }
}

这个原生插件提供了备份压缩和备份列表获取功能。

Web-Native通信代码

// 执行原生备份
function performNativeBackup(backupData) {
    return new Promise((resolve, reject) => {
        cordova.exec(
            (path) => {
                if (path) {
                    resolve(path);
                } else {
                    reject(new Error('备份失败'));
                }
            },
            (error) => {
                console.error('备份失败:', error);
                reject(error);
            },
            'BackupPlugin',
            'performBackup',
            [backupData]
        );
    });
}

// 获取备份列表
function getNativeBackupList() {
    return new Promise((resolve, reject) => {
        cordova.exec(
            (result) => {
                try {
                    const backups = JSON.parse(result);
                    resolve(backups);
                } catch (error) {
                    reject(error);
                }
            },
            (error) => {
                console.error('获取备份列表失败:', error);
                reject(error);
            },
            'BackupPlugin',
            'getBackupList',
            []
        );
    });
}

这段代码展示了如何通过Cordova调用原生的备份和列表获取功能。

📝 总结

备份恢复模块展示了Cordova与OpenHarmony在数据保护方面的应用。在Web层,我们实现了备份管理界面和恢复逻辑。在原生层,我们提供了数据压缩和文件管理功能。

通过自动备份机制,用户的数据得到定期保护。通过备份压缩,节省了存储空间。通过Web-Native通信,我们能够充分利用OpenHarmony的文件系统能力,为用户提供完整的数据备份和恢复体验。

在实际开发中,建议实现备份文件的加密,提供增量备份功能,并支持云端备份同步。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐