如何在HarmonyOS對資料庫進行備份,恢復與加密

HarmonyOS開發者社群發表於2023-11-07

資料庫備份與恢復

場景介紹

當應用在處理一項重要的操作,顯然是不能被打斷的。例如:寫入多個表關聯的事務。此時,每個表的寫入都是單獨的,但是表與表之間的事務關聯性不能被分割。

如果操作的過程中出現問題,開發者可以使用恢復功能,將資料庫恢復到之前的狀態,重新對資料庫進行操作。

在資料庫被篡改、刪除、或者裝置斷電場景下,資料庫可能會因為資料丟失、資料損壞、髒資料等而不可用,可以透過資料庫的備份恢復能力將資料庫恢復至可用狀態。

鍵值型資料庫和關係型資料庫均支援對資料庫的備份和恢復。另外,鍵值型資料庫還支援刪除資料庫備份,以釋放本地儲存空間。

鍵值型資料庫備份、恢復與刪除

鍵值型資料庫,透過backup介面實現資料庫備份,透過restore介面實現資料庫恢復,透過deletebackup介面刪除資料庫備份。具體介面及功能,可見 分散式鍵值資料庫

1.      建立資料庫。(1) 建立kvManager。

(2) 配置資料庫引數。

(3)      建立kvStore。

import distributedKVStore from '@ohos.data.distributedKVStore';
let kvManager;
let context = getContext(this);
const kvManagerConfig = {
  context: context,
  bundleName: 'com.example.datamanagertest'
}
try {
  kvManager = distributedKVStore.createKVManager(kvManagerConfig);
  console.info('Succeeded in creating KVManager.');
} catch (e) {
  console.error(`Failed to create KVManager. Code:${e.code},message:${e.message}`);
}
let kvStore;
try {
  const options = {
    createIfMissing: true,
    encrypt: false,
    backup: false,
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
    securityLevel: distributedKVStore.SecurityLevel.S2
  };
  kvManager.getKVStore('storeId', options, (err, store) => {
    if (err) {
      console.error(`Fail to get KVStore. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in getting KVStore.');
    kvStore = store;
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

2.      使用put()方法插入資料。

const KEY_TEST_STRING_ELEMENT = 'key_test_string';
const VALUE_TEST_STRING_ELEMENT = 'value_test_string';
try {
  kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Fail to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

3.      使用backup()方法備份資料。

let file = 'BK001';
try {
  kvStore.backup(file, (err) => {
    if (err) {
      console.error(`Fail to backup data.code:${err.code},message:${err.message}`);
    } else {
      console.info('Succeeded in backupping data.');
    }
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

4.      使用delete()方法刪除資料(模擬意外刪除、篡改場景)。

try {
  kvStore.delete(KEY_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Fail to delete data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in deleting data.');
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

5.      使用restore()方法恢復資料。

let file = 'BK001';
try {
  kvStore.restore(file, (err) => {
    if (err) {
      console.error(`Fail to restore data. Code:${err.code},message:${err.message}`);
    } else {
      console.info('Succeeded in restoring data.');
    }
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

6.      當本地裝置儲存空間有限或需要重新備份時,還可使用deleteBackup()方法刪除備份,釋放儲存空間。

let kvStore;
let files = ['BK001'];
try {
  kvStore.deleteBackup(files).then((data) => {
    console.info(`Succeed in deleting Backup. Data:filename is ${data[0]},result is ${data[1]}.`);
  }).catch((err) => {
    console.error(`Fail to delete Backup. Code:${err.code},message:${err.message}`);
  })
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

關係型資料庫備份與恢復

關係型資料庫,透過backup介面實現資料庫備份,透過restore介面實現資料庫恢復。具體介面及功能,可見 關係型資料庫

1.      使用getRdbStore()方法建立關係型資料庫。

import relationalStore from '@ohos.data.relationalStore';
let store;
let context = getContext(this);
const STORE_CONFIG = {
  name: 'RdbTest.db',
  securityLevel: relationalStore.SecurityLevel.S1
};
relationalStore.getRdbStore(context, STORE_CONFIG, (err, rdbStore) => {
  store = rdbStore;
  if (err) {
    console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`);
    return;
  }
  store.executeSql("CREATE TABLE IF NOT EXISTS EMPLOYEE (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary INTEGER, codes Uint8Array);", null);
  console.info('Succeeded in getting RdbStore.');
})

2.      使用insert()方法插入資料。

const valueBucket = {
  'NAME': 'Lisa',
  'AGE': 18,
  'SALARY': 100.5, 'CODES': new Uint8Array([1, 2, 3, 4, 5])
};
store.insert('EMPLOYEE', valueBucket, relationalStore.ConflictResolution.ON_CONFLICT_REPLACE, (err, rowId) => {
  if (err) {
    console.error(`Failed to insert data. Code:${err.code},message:${err.message}`);
    return;
  }
  console.info(`Succeeded in inserting data. rowId:${rowId}`);
})

3.      使用backup()方法備份資料。

store.backup('dbBackup.db', (err) => {
  if (err) {
    console.error(`Failed to backup data. Code:${err.code},message:${err.message}`);
    return;
  }
  console.info(`Succeeded in backuping data.`);
})

4.      使用delete()方法刪除資料(模擬意外刪除、篡改場景)。

let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
predicates.equalTo('NAME', 'Lisa');
let promise = store.delete(predicates);
promise.then((rows) => {
  console.info(`Delete rows: ${rows}`);
}).catch((err) => {
  console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);
})

5.      使用restore()方法恢復資料。

store.restore('dbBackup.db', (err) => {
  if (err) {
    console.error(`Failed to restore data. Code:${err.code},message:${err.message}`);
    return;
  }
  console.info(`Succeeded in restoring data.`);
})

資料庫加密

場景介紹

為了增強資料庫的安全性,資料庫提供了一個安全適用的資料庫加密能力,從而對資料庫儲存的內容實施有效保護。透過資料庫加密等安全方法實現了資料庫資料儲存的保密性和完整性要求,使得資料庫以密文方式儲存並在密態方式下工作,確保了資料安全。

加密後的資料庫只能透過介面進行訪問,無法透過其它方式開啟資料庫檔案。資料庫的加密屬性在建立資料庫時確認,無法變更。

鍵值型資料庫和關係型資料庫均支援資料庫加密操作。

鍵值型資料庫加密

鍵值型資料庫,透過options中encrypt引數來設定是否加密,預設為false,表示不加密。encrypt引數為true時表示加密。

具體介面及功能,可見 分散式鍵值資料庫

import distributedKVStore from '@ohos.data.distributedKVStore';
let kvManager;
let context = getContext(this);
const kvManagerConfig = {
  context: context,
  bundleName: 'com.example.datamanagertest'
}
try {
  kvManager = distributedKVStore.createKVManager(kvManagerConfig);
  console.info('Succeeded in creating KVManager.');
} catch (e) {
  console.error(`Failed to create KVManager. Code:${e.code},message:${e.message}`);
}
let kvStore;
try {
  const options = {
    createIfMissing: true,
    // 設定資料庫加密
    encrypt: true,
    backup: false,
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
    securityLevel: distributedKVStore.SecurityLevel.S2
  };
  kvManager.getKVStore('storeId', options, (err, store) => {
    if (err) {
      console.error(`Fail to get KVStore. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in getting KVStore.');
    kvStore = store;
  });
} catch (e) {
  console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}

關係型資料庫加密

關係型資料庫,透過StoreConfig中encrypt屬性來設定是否加密,預設為false,表示不加密。encrypt引數為true時表示加密。

具體介面及功能,可見 關係型資料庫

import relationalStore from '@ohos.data.relationalStore';
let store;
let context = getContext(this);
const STORE_CONFIG = {
  name: 'RdbTest.db',
  securityLevel: relationalStore.SecurityLevel.S1,
  encrypt: true
};
relationalStore.getRdbStore(context, STORE_CONFIG, (err, rdbStore) => {
  store = rdbStore;
  if (err) {
    console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`);
    return;
  }
  console.info(`Succeeded in getting RdbStore.`);
})


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2993189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章