鸿蒙关系型数据库开发(课本版)

1.在src/main/ets目录下创建名为common的目录,创建类RdbUtil

//导入rdb模块
import data_rdb from '@ohos.data.rdb'
//导入context模块
// @ts-ignore
import context from '@ohos.application.context';

type Context = context.Context;
const STORE_CONFIG = { name: "rdbstore.db" }

export default class RdbUtil {
  private rdbStore: any = null;
  private tableName: string;
  private sqlCreateTable: string;
  private columns: Array<string>;

  constructor(tableName: string, sqlCreateTable: string, columns: Array<string>) {
    this.tableName = tableName;
    this.sqlCreateTable = sqlCreateTable;
    this.columns = columns;
  }

  getRdbStore(callback) {
    //如果已经获取到RdbStore,则不进行操作
    if (this.rdbStore != null) {
      console.info('The rdbStore exists.');
      callback();
      return;
    }
    //应用上下文,本例是使用API9 Stage模型的Context
    let context: Context = getContext(this) as Context;
    data_rdb.getRdbStore(context, STORE_CONFIG, 1, (err, rdb) => {
      if (err) {
        console.error('gerRdbStore() failed, err: ' + err);
        return;
      }
      this.rdbStore = rdb;

      //获取到RdbStore后,需要使用executeSql接口初始化数据库表结构和相关数据
      this.rdbStore.executeSql(this.sqlCreateTable);
      console.info('getRdbStore() finished.');
      callback();
    });
  }

  //插入数据
  insertData(data, callback) {
    let resFlag: boolean = false;  	//用于记录插入是否成功的flag
    const valueBucket = data;  		//存储键-值对的类型,表示要插入表中的数据行
    this.rdbStore.insert(this.tableName, valueBucket, function (err, ret) {
      if (err) {
        console.error('Rdb', 'insertData() failed, err: ' + err);
        callback(resFlag);
        return;
      }
      callback(!resFlag);
    });
  }
  //删除数据
  deleteData(predicates, callback) {
    let resFlag: boolean = false;

    //predicates表示待删除数据的操作条件
    this.rdbStore.delete(predicates, function (err, ret) {
      if (err) {
        console.error('Rdb', 'deleteData() failed, err: ' + err);
        callback(resFlag);
        return;
      }
      callback(!resFlag);
    });
  }
  //更新数据
  updateData(predicates, data, callback) {
    let resFlag: boolean = false;
    const valueBucket = data;
    this.rdbStore.update(valueBucket, predicates, function (err, ret) {
      if (err) {
        console.error('Rdb', 'updateData() failed, err: ' + err);
        callback(resFlag);
        return;
      }
      callback(!resFlag);
    });
  }
  //查找数据
  query(predicates, callback){
    //columns表示要查询的列,如果为空,则表示查询所有列
    this.rdbStore.query(predicates, this.columns, function (err, resultSet) {
      if (err) {
        console.error('Rdb', 'query() failed, err: ' + err);
        return;
      }
      callback(resultSet);  	//如果查找成功,则返回resultSet结果集
      resultSet.close();  	//操作完成后关闭结果集
    });
  }
}

2.在ets目录下创建名为database的目录,并在database目录下创建脚本类AccountData

export default interface AccountData {
  id: number;
  accountType: number;
  typeText: string;
  amount: number;
}

3.在database目录下创建针对账目信息操作类AccountTable

import data_rdb from '@ohos.data.rdb';
import RdbUtil from '../common/RdbUtil';
import AccountData from './AccountData';

const ACCOUNT_TABLE = {
  tableName: 'accountTable',
  sqlCreate: 'CREATE TABLE IF NOT EXISTS accountTable(' +
  'id INTEGER PRIMARY KEY AUTOINCREMENT, accountType INTEGER, ' +
  'typeText TEXT, amount INTEGER)',
  columns: ['id', 'accountType', 'typeText', 'amount']
};

export default class AccountTable {

  private accountTable = new RdbUtil(ACCOUNT_TABLE.tableName, ACCOUNT_TABLE.sqlCreate,
    ACCOUNT_TABLE.columns);

  constructor(callback: Function = () => {}) {
    this.accountTable.getRdbStore(callback);
  }

  getRdbStore(callback: Function = () => {}) {
    this.accountTable.getRdbStore(callback);
  }
  //插入数据
  insertData(account: AccountData, callback) {
    //根据输入数据创建待插入的数据行
    const valueBucket = generateBucket(account);
    this.accountTable.insertData(valueBucket, callback);
  }

  //删除数据
  deleteData(account: AccountData, callback) {
    let predicates = new data_rdb.RdbPredicates(ACCOUNT_TABLE.tableName);

    //根据id匹配待删除的数据行
    predicates.equalTo('id', account.id);
    this.accountTable.deleteData(predicates, callback);
  }

  //修改数据
  updateData(account: AccountData, callback) {
    const valueBucket = generateBucket(account);
    let predicates = new data_rdb.RdbPredicates(ACCOUNT_TABLE.tableName);

    //根据id匹配待修改的数据行
    predicates.equalTo('id', account.id);
    this.accountTable.updateData(predicates, valueBucket, callback);
  }

  //查找数据
  query(amount: number, callback, isAll: boolean = true){
    let predicates = new data_rdb.RdbPredicates(ACCOUNT_TABLE.tableName);
    //是否查找全部数据
    if (!isAll) {
      predicates.equalTo('amount', amount);  //根据金额匹配要查找的数据行
    }
    this.accountTable.query(predicates, function(resultSet) {
      let count = resultSet.rowCount;

      //若查找结果为空,则返回空数组,否则返回查找结果数组
      if (count === 0 || typeof count === 'string') {
        console.log('Query no results!');
        callback([]);
      } else {
        resultSet.goToFirstRow();
        const result = [];
        for (let i = 0; i < count; i++) {
          let tmp: AccountData = { id: 0, accountType: 0, typeText: '', amount: 0 };
          tmp.id = resultSet.getDouble(resultSet.getColumnIndex('id'));
          tmp.accountType = resultSet.getDouble(resultSet.getColumnIndex
          ('accountType'));
          tmp.typeText = resultSet.getString(resultSet.getColumnIndex
          ('typeText'));
          tmp.amount = resultSet.getDouble(resultSet.getColumnIndex
          ('amount'));
          result[i] = tmp;
          resultSet.goToNextRow();
        }
        callback(result);
      }
    });
  }
}

function generateBucket(account: AccountData) {
  let obj = {};
  ACCOUNT_TABLE.columns.forEach((item) => {
    if (item != 'id') {
      obj[item] = account[item];
    }
  });
  return obj;
}

4.修改Index代码

import AccountData from '../database/AccountData';
import AccountTable from '../database/AccountTable';

@Entry
@Component
struct Index {
  @State message: string = 'HelloWorld'
  private accountTable = new AccountTable();

  aboutToAppear() {
    //初始化数据库
    this.accountTable.getRdbStore(() => {
      this.accountTable.query(0, (result) => {
        this.message = result;
      }, true);
    });
  }

  build() {
   Row() {
      Column() {
        Text(this.message)
          .fontSize(70)
          .fontWeight(FontWeight.Bold)

        //增加
        Button(('增加'), { type: ButtonType.Capsule })
          .width(140)
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            let newAccount: AccountData = { id: 0, accountType: 0, typeText: '苹果', amount: 0 };
            this.accountTable.insertData(newAccount, () => {
            })
          })

        //查询
        Button(('查询'), { type: ButtonType.Capsule })
          .width(140)
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.accountTable.query(0, (result) => {
              this.message = JSON.stringify(result);
            }, true);
          })
        //修改
        Button(('修改'), { type: ButtonType.Capsule })
          .width(140)
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            let newAccount: AccountData = { id: 1, accountType: 1, typeText: '栗子', amount: 1 };
            this.accountTable.updateData(newAccount, () => {
            })
          })

        //删除
        Button(('删除'), { type: ButtonType.Capsule })
          .width(140)
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            let newAccount: AccountData = { id: 2, accountType: 1, typeText: '栗子', amount: 1 };
            this.accountTable.deleteData(newAccount, () => {
            })
          })
      }
      .width('100%')
   }
    .height('100%')
  }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值