鸿蒙期末作业记录5(数据库的连接)

经过我不懈的努力我终于连上了华为本地的数据库🥺

思路

我需要在点击“收藏本文”后把该图书的信息添加到数据库,退出重进之后书架上的东西不会清除,通过查询数据库得到数组之后,在书架页面进行渲染。

运行效果

点击之后将图书加到了书架上,不过这只是临时的

退出该程序

再点进去之后刚刚加入的信息并没有消失(我把原本的图书码掉了)

实现过程

        我是按照黑马的视频学习的,大家有兴趣可以去看一下

        首先用到的是它提供的

import relationalStore from '@ohos.data.relationalStore';

        然后先初始化这个数据库,写数据库的名字,和安全等级

 const config = {
      name: 'Myapp.db',
      securityLevel: relationalStore.SecurityLevel.S1
    };

        接着写sql语句,根据自己的需求写

const sql = `CREATE TABLE IF NOT EXISTS TASK (
                  IMG TEXT PRIMARY KEY,
                  NAME TEXT,
                  AUTHOR TEXT)`;

        用 relationalStore.getRdbStore 方法来获取 rdbStore

 relationalStore.getRdbStore(context, config, (err, rdbStore) => {
      if (err) {
        console.log('testTag', '获取rdbStore失败');
      }
      rdbStore.executeSql(sql);
      console.log('testTag', '创建Task成功');
      this.rdbStore = rdbStore;
    });

        这个写完之后要在Entryability文件里面调用这个方法

查询操作

  async getTask() {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    let result = await this.rdbStore.query(predicates, ['IMG', 'NAME', 'AUTHOR']);//要查询的列的名称

    let tasks: TaskInfo[] = [];

    while (!result.isAtLastRow) {
      result.goToNextRow();
      let img = result.getString(result.getColumnIndex('IMG'));//查询赋值
      let name = result.getString(result.getColumnIndex('NAME'));
      let author = result.getString(result.getColumnIndex('AUTHOR'));
      tasks.push({img , name, author });//将结果存到tasks数组里面
    }
    console.log('testTag', '查询到数据');
    return tasks;//返回数组给另一个页面调用
  }

插入操作

async addTask(img: string, name: string, author: string) {
    if (!this.rdbStore) {
      throw new Error('rdbStore 尚未初始化');
    }
    return this.rdbStore.insert(this.tableName, { img, name, author });
  }

在插入的时候调用插入方法就好了

然后查询的时候要在使用的页面build方法之前写aboutToAppear方法,这个方法会在调用build方法之前调用

如下:

 aboutToAppear(){
    TaskModel2.getTask2()
      .then(tasks=>{
        this.tasks=tasks
      })
  }

代码

import relationalStore from '@ohos.data.relationalStore';
import taskpool from '@ohos.taskpool';
import { TaskInfo } from '../MainInfo/TaskInfo';

class TaskModel {

  private rdbStore: relationalStore.RdbStore;
  private tableName: string = 'TASK';

  initTBD(context) {
    const config = {
      name: 'Myapp.db',
      securityLevel: relationalStore.SecurityLevel.S1
    };
    const sql = `CREATE TABLE IF NOT EXISTS TASK (
                  IMG TEXT PRIMARY KEY,
                  NAME TEXT,
                  AUTHOR TEXT)`;
    relationalStore.getRdbStore(context, config, (err, rdbStore) => {
      if (err) {
        console.log('testTag', '获取rdbStore失败');
      }
      rdbStore.executeSql(sql);
      console.log('testTag', '创建Task成功');
      this.rdbStore = rdbStore;
    });
  }

  async getTask() {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    let result = await this.rdbStore.query(predicates, ['IMG', 'NAME', 'AUTHOR']);

    let tasks: TaskInfo[] = [];

    while (!result.isAtLastRow) {
      result.goToNextRow();
      let img = result.getString(result.getColumnIndex('IMG'));
      let name = result.getString(result.getColumnIndex('NAME'));
      let author = result.getString(result.getColumnIndex('AUTHOR'));
      tasks.push({img , name, author });
    }
    console.log('testTag', '查询到数据');
    return tasks;
  }

  async addTask(img: string, name: string, author: string) {
    if (!this.rdbStore) {
      throw new Error('rdbStore 尚未初始化');
    }
    return this.rdbStore.insert(this.tableName, { img, name, author });
  }
}
let taskModel = new TaskModel();

export default taskModel as TaskModel;

Bug

这个其实有一个Bug,就是图片存取有问题,实现不了图片的调用

我之前图片存的是Resource类型,但是数据库中我要存他的地址,是一个Text,这就导致存的时候出现了问题,我输出this.img显示的是Object类型,这个我真的很纳闷到底怎么存?

有佬指点吗

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值