ArkData——数据的坚盾(2) 原创
咱们设想一下,如果你的手机突然停止工作,所有珍贵的联系人信息、精心安排的日程瞬间消失无踪,那种失落感和不便难以言喻。这是 ArkData 解决的问题所在。它不仅仅是一款安全工具,更像是一位守护者,确保无论面对何种挑战——无论是硬件故障导致的数据丢失、存储空间告急还是意外断电等情况——你的宝贵数据都能得到妥善保护。通过提供包括自动备份与恢复功能、先进的数据库加密技术、智能的数据分类分级管理以及采用E类高强度加密算法来增强安全性等强大特性,ArkData旨在成为用户数字生活最可靠的后盾,让每个人都能安心享受科技带来的便利而不必担心重要资料的安全。
备份与恢复:数据的时光机
- 备份 就是给数据来个快照,万一数据出问题了,就能用这个快照恢复原貌。
- 恢复 就是把快照里的数据再变回现实,让一切如同未曾发生。
数据库加密:数据的保险箱
当数据库里存了一些不能让别人知道的秘密,比如密码或者财务数据,就可以用数据库加密这个保险箱把它们锁起来,只有知道密码的人才能打开。
数据分类分级:数据的保镖
数据在不同设备之间传输时,ArkData会根据数据的重要性和设备的安全性来决定哪些数据能过,哪些数据不能过,这就像是给数据配了个保镖。
E类加密数据库:数据的终极防护
E类数据库就像是个超级保险箱,就算手机被锁屏了,它也能保护里面的敏感信息。如果满足一定条件,比如多次输错密码,它就会自我销毁,保护数据不被泄露。
数据的守护秘籍
在开始修炼这些秘籍之前,我们得先了解一些基本概念。
数据库备份与恢复
- 数据库备份 就像是给数据库拍个快照,随时都能用这个快照恢复数据库。
- 数据库恢复 就是把备份的数据拿出来,恢复到数据库中。
数据库加密
数据库加密就是给数据库加个锁,只有正确的钥匙才能打开。
数据库分类分级
这就像是给数据贴上标签,根据标签和设备的安全性来决定数据的去留。
数据的守护行动
键值型数据库的守护
备份数据
首先,我们需要一个数据库管理器,就像是我们的数据库指挥官,它会帮助我们管理所有的数据库操作。
// 导入必要的模块
import { distributedKVStore } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';
// 创建KVManager和KVStore
let dbManager: distributedKVStore.KVManager;
let dbStore: distributedKVStore.SingleKVStore | undefined;
try {
dbManager = distributedKVStore.createKVManager({ context: getContext(), bundleName: 'com.example.datamanagertest' });
console.log('KVManager创建成功。');
const storeOptions: distributedKVStore.Options = {
createIfMissing: true,
encrypt: true,
backup: false,
autoSync: false,
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
securityLevel: distributedKVStore.SecurityLevel.S1
};
dbManager.getKVStore<distributedKVStore.SingleKVStore>('storeID', storeOptions, (err, store) => {
if (err) {
console.error(`获取KVStore失败。代码:${err.code}, 消息:${err.message}`);
return;
}
console.log('获取KVStore成功。');
dbStore = store;
});
} catch (e) {
let error = e as BusinessError;
console.error(`创建KVManager失败。代码:${error.code}, 消息:${error.message}`);
}
插入数据
接下来,我们可以往数据库里存点东西,比如一些重要的信息。
const testKey = 'test_key';
const testValue = 'test_value';
try {
dbStore?.put(testKey, testValue, (err) => {
if (err !== undefined) {
console.error(`插入数据失败。代码:${err.code}, 消息:${err.message}`);
return;
}
console.log('数据插入成功。');
});
} catch (e) {
let error = e as BusinessError;
console.error(`发生意外错误。代码:${error.code}, 消息:${error.message}`);
}
备份数据
然后,我们可以给数据库做个备份,以防万一。
const backupFileName = 'backup001';
try {
dbStore?.backup(backupFileName, (err) => {
if (err) {
console.error(`备份数据失败。代码:${err.code}, 消息:${err.message}`);
} else {
console.log('数据备份成功。');
}
});
} catch (e) {
let error = e as BusinessError;
console.error(`发生意外错误。代码:${error.code}, 消息:${error.message}`);
}
删除数据
如果有些数据不再需要,我们可以把它们删掉。
try {
dbStore?.delete(testKey, (err) => {
if (err !== undefined) {
console.error(`删除数据失败。代码:${err.code}, 消息:${err.message}`);
return;
}
console.log('数据删除成功。');
});
} catch (e) {
let error = e as BusinessError;
console.error(`发生意外错误。代码:${error.code}, 消息:${error.message}`);
}
恢复数据
如果数据被误删或者损坏,我们可以用备份来恢复数据。
const backupFileName = 'backup001';
try {
dbStore?.restore(backupFileName, (err) => {
if (err) {
console.error(`恢复数据失败。代码:${err.code}, 消息:${err.message}`);
} else {
console.log('数据恢复成功。');
}
});
} catch (e) {
let error = e as BusinessError;
console.error(`发生意外错误。代码:${error.code}, 消息:${error.message}`);
}
删除备份
如果备份占用了太多空间,我们可以删掉它们。
const filesToDelete = ['backup001'];
try {
dbStore?.deleteBackup(filesToDelete).then((data) => {
console.log(`成功删除备份。文件名: ${data[0]}, 结果: ${data[1]}.`);
}).catch((err: BusinessError) => {
console.error(`删除备份失败。代码:${err.code}, 消息:${err.message}`);
});
} catch (e) {
let error = e as BusinessError;
console.error(`发生意外错误。代码:${error.code}, 消息:${error.message}`);
}
关系型数据库的守护
手动备份
数据库操作或者存储过程中,有可能会因为各种原因发生非预期的数据库损坏等异常情况,可以根据需要使用关系型数据库的备份能力,以便在数据库损坏时,可靠高效地恢复数据保证业务数据正常使用。
import { relationalStore } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
let relationalDB: relationalStore.RdbStore | undefined;
const dbConfig: relationalStore.StoreConfig = {
name: 'relationalDB.db',
securityLevel: relationalStore.SecurityLevel.S3,
allowRebuild: true
};
relationalStore.getRdbStore(getContext(), dbConfig, (err, rdbStore) => {
relationalDB = rdbStore;
if (err) {
console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`);
return;
}
console.log('Succeeded in getting RdbStore.');
(relationalDB as relationalStore.RdbStore).backup("relationalDBBackup.db", (err: BusinessError) => {
if (err) {
console.error(`Failed to backup RdbStore. Code:${err.code}, message:${err.message}`);
return;
}
console.log(`Succeeded in backing up RdbStore.`);
});
});
数据库损坏重建
在创建或使用关系型数据库的过程中,如果抛出14800011异常错误码说明数据库发生损坏,此时需要重建数据库并恢复数据。
// 假设数据库损坏,需要重建
if (err.code === 14800011) {
console.error('数据库损坏,需要重建');
// 重建数据库逻辑
}
数据恢复
针对数据库损坏的情况,在数据库重建成功后,需要用提前备份好的数据进行数据恢复。
let backupPath = getContext().databaseDir + '/backup/relationalDBBackup.db';
try {
if (!fileIo.access(backupPath)) {
console.log("备份文件不存在");
return;
}
(relationalDB as relationalStore.RdbStore).restore(backupPath);
console.log('数据恢复成功');
} catch (e