2

OpenHarmony JS 关系型数据库使用示例-开源基础软件社区-51CTO.COM

 2 years ago
source link: https://ost.51cto.com/posts/13934
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

OpenHarmony JS 关系型数据库使用示例 原创 精华

作者:杜晨阳

在应用开发的过程中,数据存储是一项重要功能。那么在鸿蒙系统中,作为数据持久化存储之一的数据库是怎么使用的呢?
下面给大家带来的是基于api8版本的数据库使用示例

import dataRdb from '@ohos.data.rdb'

关系型数据库的使用

1、创建数据库及表格

    const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME
        + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT NOT NULL,AGE NUMBER,SCORE BLOB)";
    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        // @ts-ignore 创建数据库中表格
        rdbStore.executeSql(SQL_CREATE_TABLE);
    })

2、增/删/改/查数据库数据
新增数据

    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        rdbStore.insert(TABLE_NAME, info, function (err, ret) {
        })
    })
    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
        predicates.equalTo("NAME", info);
        rdbStore.delete(predicates, function (err, rows) {
        })
    })
    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
        predicates.equalTo("NAME", oldInfo.name).equalTo("AGE", oldInfo.age);
        rdbStore.update(newInfo, predicates, function (err, ret) {
        })
    })
    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        let datas = [];
        let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
        rdbStore.query(predicates, ["NAME", "AGE", "SCORE"],function (err, resultSet) {
        })
   })

 或者使用sql语句
    dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
        let datas = [];
        rdbStore.querySql("SELECT * FROM " + TABLE_NAME, [], function (err, resultSet) {
        })
   })

注:增删改查也可以执行sql语句,但是没有返回值,示例:

    dataRdb.deleteRdbStore(STORE_CONFIG.name, function (err, rdbStore) {
        rdbStore.executeSql("DELETE FROM EMPLOYEE", null, function () {
        })
    })

3、删除数据库

    dataRdb.deleteRdbStore(STORE_CONFIG.name, function (err, rdbStore) {
    })

完整代码示例

// @ts-nocheck
import dataRdb from '@ohos.data.rdb'

const STORE_VERSION = 1;
const STORE_CONFIG = {
    name: "RdbLocal.db"
}
const TABLE_NAME = "table_name";
const TAG = "RdbManager";

/**
 * 数据库管理类,基于API 8版本
 *   Info:{
        //名称:String
        name:"小明",
        //年龄:Number
        age : "18",
        //分数: BLOB 整型数组
        score: new Uint8Array([60, 70, 80]),
   }
 */
export default class RdbManager {
    /**
     * 初始化数据库及表,在应用启动时必须先调用,
     * 调用方式:RdbManager.createRdb();
     */
    createRdb() {
        const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME
        + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT NOT NULL,AGE NUMBER,SCORE BLOB)";
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            // @ts-ignore 创建数据库中表格
            rdbStore.executeSql(SQL_CREATE_TABLE);
            console.info(TAG + ' createRdb table done. ' + err);
        })
    }
    /**
     * 删除数据库
     * 调用方式:RdbManager.createRdb();
     */
    deleteRdb() {
        dataRdb.deleteRdbStore(STORE_CONFIG.name, function (err, rdbStore) {
            console.info(TAG + '  delete store done. ' + err)
        })
    }

    /**
     * 添加数据
     * return 执行结果 true 添加成功   false 添加失败
     *
     * 调用方式:RdbManager.insertInfo(info,function (result) {});
     */
    insertInfo(info, callback) {
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            rdbStore.insert(TABLE_NAME, info, function (err, ret) {
                console.info(TAG + ' insertInfo table done. ' + "  err:" + err + "  ret:" + ret);
                let result = false;
                if (ret > 0) {
                    result = true;
                }
                callback(result);
            })
        })
    }
    /**
     * 删除数据
     * return 执行结果 true 删除成功   false 删除失败
     *
     * 调用方式:RdbManager.deleteInfo(info,function (result) {});
     */
    deleteInfo(info, callback) {
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
            predicates.equalTo("NAME", info);
            rdbStore.delete(predicates, function (err, rows) {
                console.log(TAG + "  deleteInfo table done. rows: " + rows)
                let result = false;
                if (rows > 0) {
                    result = true;
                }
                callback(result);
            })
        })
    }

    /**
     * 更新数据
     * return 执行结果 true 更新成功   false 更新失败
     *
     * 调用方式:RdbManager.updateInfo(oldInfo, newInfo,function (result) {});
     * oldInfo,newInfo 都是Info类型
     */
    updateInfo(oldInfo, newInfo, callback) {
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
            predicates.equalTo("NAME", oldInfo.name).equalTo("AGE", oldInfo.age);
            rdbStore.update(newInfo, predicates, function (err, ret) {
                console.log(TAG + "  updateInfo table done. row count: " + ret)
                let result = false;
                if (ret > 0) {
                    result = true;
                }
                callback(result);
            })
        })
    }

    /**
     * 查询全部数据,使用sql语句
     * return array Info
     *
     * 调用方式:RdbManager.queryAllInfoBySql(function (result) {});
     */
    queryAllInfoBySql(callback) {
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            let datas = [];
            rdbStore.querySql("SELECT * FROM " + TABLE_NAME, [], function (err, resultSet) {
                console.log(TAG + "  queryAllInfoBySql table done: " + resultSet.rowCount + "   resultSet.isEnded:" + resultSet.isEnded);
                //rowCount 代表查询结果总数量
                if (resultSet.rowCount === 0) {
                    resultSet.close()
                    resultSet = null;
                    callback(datas);
                }
                while (!resultSet.isEnded) {
                    console.log(TAG + "  queryAllInfoBySql  resultSet.rowIndex:" + resultSet.rowIndex);
                    //rowIndex 默认角标是-1
                    if (resultSet.rowIndex < 0) {
                        resultSet.goToFirstRow();
                    } else {
                        resultSet.goToNextRow();
                    }
                    var name = resultSet.getString((resultSet.getColumnIndex("NAME")));
                    var age = resultSet.getLong((resultSet.getColumnIndex("AGE")));
                    var score = resultSet.getBlob((resultSet.getColumnIndex("SCORE")));
                    let info = {}
                    info.name = name;
                    info.age = age;
                    info.score = score;
                    datas.push(info);
                    if (resultSet.isAtLastRow) {
                        resultSet.close()
                        resultSet = null;
                        callback(datas);
                    }
                }
            })
        })
    }
    /**
     * 查询全部数据,使用查询api
     * return array Info
     *
     * 调用方式:RdbManager.queryAllInfo(function (result) {});
     */
    queryAllInfo(callback) {
        dataRdb.getRdbStore(STORE_CONFIG, STORE_VERSION, function (err, rdbStore) {
            let datas = [];
            let predicates = new dataRdb.RdbPredicates(TABLE_NAME);
            rdbStore.query(predicates, ["NAME", "AGE", "SCORE"],
                function (err, resultSet) {
                    console.log(TAG + "  queryAllInfo table done: " + resultSet.rowCount);
                    if (resultSet.rowCount === 0) {
                        resultSet.close()
                        resultSet = null;
                        callback(datas);
                    }
                    while (!resultSet.isEnded) {
                        if (resultSet.rowIndex < 0) {
                            resultSet.goToFirstRow();
                        } else {
                            resultSet.goToNextRow();
                        }
                        var name = resultSet.getString((resultSet.getColumnIndex("NAME")));
                        var age = resultSet.getLong((resultSet.getColumnIndex("AGE")));
                        var score = resultSet.getBlob((resultSet.getColumnIndex("SCORE")));
                        let info = {
                            name: name,
                            age: age,
                            score: score,
                        }
                        datas.push(info);
                        if (resultSet.isAtLastRow) {
                            resultSet.close()
                            resultSet = null;
                            callback(datas);
                        }
                    }
                })
        })
    }
}
import RdbManager from '../../RdbManager.js';

const TAG = "rdbDemo";
let mRdbManager = new RdbManager();

export default {
    data: {
       
    },
    createRdb: function () {
        mRdbManager.createRdb();
    },
    inseatRdb: function () {
        let info = {
            name: "张三",
            age: 26,
            score: new Uint8Array([100, 99, 100]),
        }
        let info2 = {
            name: "李四",
            age: 22,
            score: new Uint8Array([60, 88, 70]),
        }
        mRdbManager.insertInfo(info, function (result) {
            console.log(TAG + " insertInfo1  result:" + result)
        });
        mRdbManager.insertInfo(info2, function (result) {
            console.log(TAG + " insertInfo2  result:" + result)
        });
    },
    deleteRdb: function () {
        mRdbManager.deleteInfo("张三", function (result) {
            console.log(TAG + " deleteInfo  result:" + result)
        });
    },
    updateRdb: function () {
        let oldInfo = {
            name: "李四",
            age: 22,
        }
        let newInfo = {
            age: 18,
            score: new Uint8Array([100, 100, 100]),
        }
        mRdbManager.updateInfo(oldInfo, newInfo, function (result) {
            console.log(TAG + " deleteInfo  result:" + result)
        });
    },
    queryRdb: function () {
        mRdbManager.queryAllInfo(function (result) {
            console.log(TAG + "  queryRdb result.length:" + result.length);
            result.forEach(item => {
                console.log(TAG + " queryRdb  item.name:" + item.name + "  item.age:" + item.age + "  item.score:" + item.score)
            })
        });
    },
}

以上代码示例可在DevEco Studio 3.0 Beta1 使用Remote Emulator P40 Pro API7版本演示
最后跟大家分享一些开发过程中的注意事项

1、目前针对于数据库版本更新,没有提供对应接口可以直接调用。如有需要,可以尝试通过手写sql语句实现版本更新功能。

2、在数据库表格中插入数据时,支持的数据字段类型包括ValueType(number、string、boolean)、Uint8Array、null 。
但是在查询结果的结果集ResultSet中,未提供getBoolean方法,不推荐插入boolean类型数据。

3、在插入string类型数据时,注意类型匹配,不要直接将number数据存入数据库中string字段下。
已知问题:将number 类型 99存入string类型字段后,数据库自动将该数据变更为“99.00”。通过ResultSet.getString()返回值为“99.00”

关系型数据库

更多原创内容请关注:深开鸿技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK