鸿蒙 —— 关系型数据库

建库建表

// entry/src/main/ets/database/AccountTagTable.ets
import { relationalStore } from '@kit.ArkData';

export interface TableData {
  id: number,
  tagName: string,
  tagImage: string,
  tagNumber: number,
  accountType: number
}

function bucket(data: TableData): relationalStore.ValuesBucket {
  let obj: relationalStore.ValuesBucket = {
    tagName: data.tagName,
    tagImage: data.tagImage,
    tagNumber: data.tagNumber,
    accountType: data.accountType
  }
  return obj
}

export default class AccountTagTable {
  private tableName: string = 'tagTable'
  // 表结构:tagTable (id, tagName, tagImage, tagNumber, accountType)
  private createTable = 'CREATE TABLE IF NOT EXISTS tagTable (id INTEGER PRIMARY KEY AUTOINCREMENT' +
    ', tagName Text, tagImage Text, tagNumber INTEGER, accountType INTEGER)';
  private rdbStore: relationalStore.RdbStore | undefined = undefined;

  // 建库建表
  getRdbStore(callback: Function) {
    const STORE_CONFIG :relationalStore.StoreConfig= { // 关系数据库配置
      name: 'Rdb.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S3, // 数据库安全级别,
      allowRebuild: true // 指定数据库是否支持异常时自动删除,并重建一个空库空表
    };

    let context: Context = getContext(this) as Context
    relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => { // 建库:Rdb.db
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      this.rdbStore = store

      // 当数据库创建时,数据库默认版本为0
      if (store.version === 0) {
        store.executeSql(this.createTable); // 建表
        // 设置数据库的版本,入参为大于0的整数
        store.version = 1;
      }

      callback()
    });
  }

  // 增
  insert(data: TableData, callback: Function) {
    const valuesBucket: relationalStore.ValuesBucket = bucket(data)
    if (this.rdbStore !== undefined) {
      this.rdbStore.insert(this.tableName, valuesBucket, (err) => {
        if (err) {
          console.error(`Insert failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 删
  delete(data: TableData, callback: Function) {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', data.id);
    if (this.rdbStore !== undefined) {
      this.rdbStore.delete(predicates, (err) => {
        if (err) {
          console.error(`Delete failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 改
  update(data: TableData, callback: Function) {
    const valuesBucket: relationalStore.ValuesBucket = bucket(data)
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', data.id);
    if (this.rdbStore !== undefined) {
      this.rdbStore.update(valuesBucket, predicates, (err) => {
        if (err) {
          console.error(`Updated failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 查
  querySql(callback: Function) {
    if (this.rdbStore !== undefined) {
      this.rdbStore.querySql('SELECT * FROM tagTable ORDER BY tagNumber ASC', (err, resultSet) => {
        if (err) {
          console.error(`Query failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        const result: TableData[] = []
        // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
        while (resultSet.goToNextRow()) {
          let tmp: TableData = {
            id: resultSet.getLong(resultSet.getColumnIndex("id")),
            tagName: resultSet.getString(resultSet.getColumnIndex("tagName")),
            tagImage: resultSet.getString(resultSet.getColumnIndex("tagImage")),
            tagNumber: resultSet.getLong(resultSet.getColumnIndex("tagNumber")),
            accountType: resultSet.getLong(resultSet.getColumnIndex("accountType"))
          }
          result.push(tmp)
        }
        callback(result)
        // 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露
        resultSet.close();
      })
    }
  }

  // 从指定的数据库备份文件恢复数据库
  backup(callback: Function) {
    if (this.rdbStore != undefined) {
      this.rdbStore.backup("Backup.db", (err) => {
        if (err) {
          console.error(`Backup failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 从指定的数据库备份文件恢复数据库
  restore(callback: Function) {
    if (this.rdbStore != undefined) {
      this.rdbStore.restore('Backup.db', (err) => {
        console.log('112244')
        if (err) {
          console.error(`Restore failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }
}

使用

import AccountTagTable, { TableData } from '../database/AccountTagTable'

@Entry
@Component
struct Index {
  private rdb = new AccountTagTable()
  @State tableData: TableData = {
    id: -1,
    tagName: '',
    tagImage: '',
    tagNumber: 1,
    accountType: 0
  }

  aboutToAppear(): void {
    this.rdb.getRdbStore(() => {
      this.rdb.querySql((result: TableData[]) => {
        // 查询数据
      })
    })
  }
  
  build() {
  
  }
}
// 增
this.rdb.insert(this.tableData, () => {
   
})
// 删
this.rdb.delete(this.tableData, () => {
   
})
// 改
this.rdb.update(this.tableData, () => {
   
})
### 鸿蒙 OS 登录注册功能实现与数据库连接 #### 1. 后端 API 的创建 为了使鸿蒙应用能够顺利执行登录和注册操作,需先构建后端API来处理这些请求。这涉及到设置HTTP接口以便于前端发送用户名、密码等信息,并由服务器验证或保存至数据库。 对于登录逻辑而言,在接收到带有凭证的数据包之后,应当检查其合法性;而针对新用户的加入,则要确保提交的信息被妥善存入指定的关系型数据库中[^2]。 #### 2. 数据库配置与初始化 在鸿蒙环境中利用Java语言完成关系型数据库的操作时,首先要定义好所使用的具体类型(比如MySQL),接着按照官方文档指示设定必要的参数——像文件名那样独一无二的名字以及决定性的读写权限属性。除此之外,还需精心设计表格布局以适应应用程序的需求,例如用户账户资料表单里应包含但不限于ID号、昵称字段等等[^3]。 #### 3. 客户端到服务器通信机制 当一切准备就绪以后,就可以着手编写用于发起网络调用的部分了。这里推荐采用OkHttp作为第三方库辅助简化编码工作量。下面给出了一段简单的代码片段展示如何向远程地址传送JSON格式化后的对象实例: ```java // 导入库 import okhttp3.*; public class UserAuth { private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public void sendRequest(String url, String json){ OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(json, JSON); Request request = new Request.Builder() .url(url) .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()){ throw new IOException("Unexpected code " + response); } System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } } ``` 此方法接受两个字符串类型的参数:一个是目标网址链接,另一个则是待传输的内容主体部分经过序列化的版本。它会构造POST请求并将结果反馈回来供后续分析使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值