IT评测·应用市场-qidao123.com

标题: HarmonyOS:数据库的创建以及数据库操作的具体用法 [打印本页]

作者: 万万哇    时间: 2025-1-10 00:01
标题: HarmonyOS:数据库的创建以及数据库操作的具体用法
前言:我们的App加载数据很多都是采用本地化数据,数据都是存在数据库中的,本地有个小型数据库,所有的主数据都存在本地,用来支持业务数据的展示,业务逻辑处理。之前在安卓系统和ios系统上都是得心应手的,网上的方法也比力多,但是到了鸿蒙系统,只有官方资料可查,大概开源的demo可参考,本人基于同事以及本身开辟中发现的问题,鸿蒙系统的数据库操作整理一份博客,一起记录问题,并解决问题。
相关类先容:

DatabaseHelp类,重要是创建数据库,创建表
DatabaseSqlUtil类,重要是创建表的语句
ParseServerDataManager类,重要是插入数据,以及数据解析,数据整理,数据插入、删除操作
DatabaseManager类,数据库操作,增删改查
class:DatabaseSqlUtil类

  1. export class DatabaseSqlUtil {
  2.   // 数据库配置
  3.   public static STORE_CONFIG :relationalStore.StoreConfig= {
  4.     name: 'test.db', // 数据库文件名
  5.     securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别
  6.     encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
  7.     customDir: 'winchannel' // 可选参数,数据库自定义路径。数据库将在如下的目录结构中被创建:context.databaseDir + '/rdb/' + customDir,其中context.databaseDir是应用沙箱对应的路径,'/rdb/'表示创建的是关系型数据库,customDir表示自定义的路径。当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
  8.   };
  9.   //建表语句
  10.   public static CREATE_BASE_STORE_TABLE:string = 'CREATE TABLE IF NOT EXISTS base_store (_id INTEGER PRIMARY KEY AUTOINCREMENT,id TEXT, name TEXT, cod TEXT, styp TEXT, addr TEXT )'
  11. }
复制代码
代码中的解释已经很清楚了。
class:DatabaseHelper

  1. export class DatabaseHelper{
  2.   constructor(context:Context) {
  3.     // 获取数据库Store
  4.     relationalStore.getRdbStore(context, DatabaseSqlUtil.STORE_CONFIG, (err, rdbStore) => {
  5.       if (err) {
  6.         conslog.info(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  7.         return;
  8.       }
  9.       WinLog.info('WINLOG Succeeded in getting RdbStore.');
  10.       this.createTable(rdbStore)
  11.     });
  12.   }
  13.   /**
  14.    * 创建表.
  15.    */
  16.   private createTable(rdbStore: relationalStore.RdbStore):void {
  17.     // 判断数据库版本,如果不匹配则需进行升降级操作
  18.     if (rdbStore == undefined){
  19.       conslog.info('WINLOG rdbStore undefined');
  20.       return
  21.     }
  22.     conslog.info('WINLOG store.version--->' + rdbStore.version);
  23.     // 当数据库创建时,数据库默认版本为0
  24.     if (rdbStore.version === 0) {
  25.       rdbStore.executeSql(DatabaseSqlUtil.CREATE_BASE_STORE_TABLE);
  26.       // 设置数据库的版本,入参为大于0的整数
  27.       rdbStore.version = 1;
  28.       conslog.info('WINLOG version 0 action');
  29.     }
  30.     // 如果数据库版本不为0且和当前数据库版本不匹配,需要进行升降级操作
  31.     // 当数据库存在并假定版本为1时,例应用从某一版本升级到当前版本,数据库需要从1版本升级到2版本
  32.     if (rdbStore.version === 1) {
  33.       // version = 1:表结构:EMPLOYEE (NAME, SALARY, CODES, ADDRESS) => version = 2:表结构:EMPLOYEE (NAME, AGE, SALARY, CODES, ADDRESS)
  34.       if (rdbStore !== undefined) {
  35.         (rdbStore as relationalStore.RdbStore).executeSql(DatabaseSqlUtil.ALTER_BASE_ACVT_QST_COLUMN_memo);
  36.         rdbStore.version = 2;
  37.       }
  38.       conslog.info('WINLOG version 1 action');
  39.     }
  40.   }
  41. }
复制代码
建数据库的时候有个版本控制,后续可以更新版本用来控制数据库的更新表的列,新增表操作
//表操作类:DatabaseManager

//批量数据插入,整个数组一次性插入
  1. export class DatabaseManager{
  2.   static batchInsertTableData(context:Context, tableName:string, bucketArray:ValuesBucket[] ){
  3.     // 获取数据库Store
  4.     relationalStore.getRdbStore(context, DatabaseSqlUtil.STORE_CONFIG, (err, rdbStore) => {
  5.       if (err) {
  6.         conslog.info(`batchInsertTableData ${tableName} Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  7.         return;
  8.       }
  9.       conslog.info('batchInsertTableData Succeeded in getting RdbStore.');
  10.       if(rdbStore != undefined) {
  11.         (rdbStore as relationalStore.RdbStore).batchInsert(tableName, bucketArray, (err, insertNum) => {
  12.           if (err) {
  13.             conslog.error(`${tableName}batchInsert is failed, code is ${err.code},message is ${err.message}`);
  14.             return;
  15.           }
  16.           conslog.info(`${tableName}batchInsert is successful, the number of values that were inserted = ${insertNum}`);
  17.         })
  18.       }
  19.     });
  20.   }
  21. }
复制代码
我们这里的数据比力多,用的批量插入,你的数据少的话,可以一条插入:
语法:
  1. (rdbStore as relationalStore.RdbStore).insert(tableName, bucketArray, (err, insertNum) => {
  2.           if (err) {
  3.             conslog.error(`${tableName}batchInsert is failed, code is ${err.code},message is ${err.message}`);
  4.             return;
  5.           }
  6.           conslog.info(`${tableName}batchInsert is successful, the number of values that were inserted = ${insertNum}`);
  7.         })
复制代码
删除操作:
  1. static deleteTableDataByTabName(context:Context, tableName:string){
  2.     // 获取数据库Store
  3.     relationalStore.getRdbStore(context, DatabaseSqlUtil.STORE_CONFIG, (err, rdbStore) => {
  4.       if (err) {
  5.         conslog.info(`${tableName} deleteTableData Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
  6.         return;
  7.       }
  8.       conslog.info(`deleteTableData ${tableName}  Succeeded in getting RdbStore.`);
  9.       if(rdbStore != undefined) {
  10.         //创建谓词,进行删除
  11.         let rdbPredicates = new relationalStore.RdbPredicates(tableName);
  12.         (rdbStore as relationalStore.RdbStore).delete(rdbPredicates, (err, rows) => {
  13.           if (err) {
  14.             conslog.info(`${tableName} Delete failed, code is ${err.code},message is ${err.message}`);
  15.             return;
  16.           }
  17.           conslog.info(`${tableName} Delete rows: ${rows}`);
  18.         })
  19.       }
  20.     });
  21.   }
复制代码
数据处理类:ParseServerDataManager

  1. function parseBaseStoreData(context: Context, jsonData: string, serverNode:string){
  2. //先删后插
  3.   DatabaseManager.deleteTableDataByTabName(context,"base_store")
  4.   let parseStoreList: ValuesBucket[] = []
  5.     let storesList: BaseStore[] = JSON.parse(jsonData)[serverNode]
  6.     if (storesList == undefined) {
  7.       WinLog.info("stores is null")
  8.       return
  9.     }
  10.     storesList.forEach((item) => {
  11.       item.server_node = serverNode
  12.       let storeFilter:string[] = ['id','name','empId','cod','lat','lon','addr'];
  13.       let storeValuesBucket: ValuesBucket = JSON.parse(JSON.stringify(item,  storeFilter),replacer)
  14.       parseStoreList.push(storeValuesBucket)
  15.     })
  16.     DatabaseManager.batchInsertTableData(context, "base_store", parseStoreList);
  17. }
  18. function replacer(key: string, value: Object): Object {
  19.   if (key != '_id' && typeof value == 'number') {
  20.     value = value.toString()
  21.   }
  22.   if (key == 'opt') {
  23.     value = value.toString()
  24.   }
  25.   return value
  26. }
复制代码
这里遇到一个问题,假如你解析的数据,有object类型的,插入数据的时候,会在表里显示【object object】,JSON.parse在解析json到对象的时候,就会将object类型数据解析成object,插入数据的时候也就插入object了,这不是我想要的,我想插入的是string类型数据,
  1. parse(text: string, reviver?: Transformer, options?: ParseOptions): Object | null
复制代码
此方法就有用了,
官方解释:reviver Transformer 否 转换函数,传入该参数,可以用来修改解析天生的原始值。默认值是undefined。
传入次参数,可以指定key值不解析成object,保持原来的类型值,这个有时候开辟很难留意到,希望有帮到你们。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4