成长记录——数据库获取数据转换格式并暴露接口

2023-11-12

需求:新功能增加,完成软件新界面增加(包含逻辑与数据)

实现:

  • 获取数据库内容
    • 为接口定义对应的数据格式
    • 完成数据结构组成
    • 数据获取接口实现
    • 数据更改后写入数据库接口实现

获取数据库内容;

  • 首先,已经默认拥有了数据库,并内部已有数据;
  • 定义数据接口
bool GetLifetime(vector<shared_ptr<LifetimeAddr>>& datas);
这里无法知晓数据大小,采用容器智能指针的方式获取数据,并使用bool返回值确定是否获取成功
  • 完成接口内容实现
bool GetLifetime(vector<shared_ptr<LifetimeAddr>>& datas)
    {
        string sql = "SELECT "
            "t1.id, t1.name_id,"
            "t1.used, t1.warn, t1.stop,"
            "t1.usedAddr, t1.warnAddr, t1.stopAddr,"
            "t1.timeReplace, t1.permission "
            "FROM t_ui_lifetime t1 "
            "ORDER BY t1.id ASC";
        SqliteResult result;
        int r = execSql(sql, result);
        if (r || result.m_vecValues.empty())
            return SQL_CODE_2_BOOL(r);

        if (!datas.empty())
            datas.clear();
      /*  if (&datas != nullptr)
            &datas == NULL;*/
        for (size_t i = 0; i < result.m_vecValues.size(); i++)
        {
            shared_ptr<LifetimeAddr> addr = make_shared<LifetimeAddr>();
            _GetLifetimeValue(result, i, addr);
            datas.push_back(addr);
        }

        return SQL_CODE_2_BOOL(r);
    }

  • 定义string类型变量,接收SQL语句读取出的数据库内容
  • FORM t_ui_lifeime ti 表名太长,取别名为 t1;
  • ORDER BY t1.id ASC 为id索引
  • SqliteResult 为字符串容器类,内部定义两个vetor容器;如图
 struct SqliteResult {
        vector<string> m_vecIds;
        vector<vector<string>> m_vecValues;
    };

  • 调用 execSql进行数据处理,并加入判断触发断点,通过返回值r判断是否读取到对应数据
  • 为防止多次获取同类数据,加入判断,若 datas 不为空,将 datas 内容清楚
   if (!datas.empty())
            datas.clear();
  • 定义智能指针addr,调用_GetLifetimeValue将addr中的内容加到datas中;并判断返回值
  • _GetLifetimeValue函数实现如下
  void _GetLifetimeValue(const SqliteResult& result, size_t index, shared_ptr<LifetimeAddr> addr)
    {
        addr->id = result.m_vecValues.at(index).at(0);  //添加ID内容到数组容器,位置信息取0
        addr->nameId = result.m_vecValues.at(index).at(1);
        addr->usedMeter = result.m_vecValues.at(index).at(2);
        addr->warnMeter = result.m_vecValues.at(index).at(3);
        addr->stopMeter = result.m_vecValues.at(index).at(4);
        addr->timeReplace = result.m_vecValues.at(index).at(8);
        addr->permission = result.m_vecValues.at(index).at(9);

        _GetResultValue(result, index, addr->usedAddr, 5, false, false, false, true);
        _GetResultValue(result, index, addr->warnAddr, 6, false, false, false, true);
        _GetResultValue(result, index, addr->stopAddr, 7, false, false, false, true);
    }

标题- 至此,完成数据的内容已到达 GetLifetime()函数中;将所需数据转化为需要的格式

  • 为数据定义数据格式
struct LifetimeAddr
{
    LifetimeAddr() : 
        //构造函数初始化
        usedAddr(make_shared<BasePlcAddr>()),
        warnAddr(make_shared<BasePlcAddr>()),
        stopAddr(make_shared<BasePlcAddr>())
    {
     
    }

    string id;
    string nameId;
    string usedMeter;
    string warnMeter;
    string stopMeter;
    string timeReplace;
    string permission;

    shared_ptr<BasePlcAddr> usedAddr;
    shared_ptr<BasePlcAddr> warnAddr;
    shared_ptr<BasePlcAddr> stopAddr;
};
  • 完成目标数据格式josn格式的转变
string DataMain::Lifetime2Json(const vector<shared_ptr<LifetimeAddr>>& v1)
{
    Json::Value root;
    _Lifetime2JsonValue(v1, root);
    string r = root.toStyledString();
    return r;
}

string DataMain::Lifetime2Json()
{
    string result= Lifetime2Json(m_vecLifetime);
    return result;
    return "";
}

_Lifetime2JsonValue ()函数完成Json数据格式转换,内部处理方便给界面层使用(此处写的不是很好,调用了两次,容易混乱,其实目的就是把从数据库读取出的数据,转变为对应格式,方便调用

void DataMain::_Lifetime2JsonValue(const vector<shared_ptr<LifetimeAddr>>& v, Json::Value& root)
{
    Json::Value arr;
    for (auto i : v)
    {
        Json::Value tmp;
        tmp["id"] = i->id;
        tmp["name_id"] = i->nameId;
        tmp["usedMeter"] = i->usedMeter;
        tmp["warnMeter"] = i->warnMeter;
        tmp["stopMeter"] = i->stopMeter;
        tmp["usedAddr"] = i->usedAddr->address;
        tmp["warnAddr"] = i->warnAddr->address;
        tmp["stopAddr"] = i->stopAddr->address;
        tmp["permission"] = i->permission;
        tmp["timeReplace"] = i->timeReplace;
        arr.append(tmp);
    }
     root["lifetime"] = arr;
}

至此,数据以及可以通过接口GetLifetime()传递出去,接下来要解决接口返回数据写入数据库的问题

  • 定义一个返回写入接口
DLL_EXPORT bool CALL_CONV SetWarnAndStopLifeTime(const char* id, const char* warnNull, const char* stopNull, const char* time);

  • List item DLL_EXPORT 为宏定义,本质上是_declspec(dllexport)声明,目的为了生成动态库;
  • CALL_CONV为宏定义,本质上是_stdcall,目的是约定调用
  • 函数实现
DLL_EXPORT bool CALL_CONV SetWarnAndStopLifeTime(const char* id, const char* warnNull,const char* stopNull,const char* time)
{

    int r = hmx::sqlite::updates("t_ui_lifetime", "warn", vector<string>{warnNull}, "id", vector<string>{id});
    if (r != 0)return false;
     r = hmx::sqlite::updates("t_ui_lifetime", "stop", vector<string>{stopNull}, "id", vector<string>{id});
     if (r != 0)return false;
     r = hmx::sqlite::updates("t_ui_lifetime", "timeReplace", vector<string>{time}, "id", vector<string>{id});    
     if (r != 0)return false;
     r = hmx::sqlite::GetLifetime(g_dataMain->m_vecLifetime);//重新加载数据库数据
     if (r != 0)return false;
        return true;
  • 共需要些入数据库四个参数,依次分别是 id,warn,stop和time,定义函数四个参数(id作为key值,不需要处理)
  • 因此调用updates函数对写入数据库,updates函数实现如下
// 更新多条数据的同一个字段的值
    int updates(const string& tableName, const string& opKey, const vector<string>& opValues,
        const string& conditionKey, const vector<string> conditionValues)
    {
        SqliteOperate* op = new SqliteOperate(g_currentExePath + "/" + g_sqlitePath, "updateConnect");
        if (!op || !op->CheckValid())
            return ErrorCode::CONNECT_INVALID;

        bool isTranslation = true;
        if (isTranslation)
            op->Translation();

        int r = _updates(tableName, opKey, opValues, conditionKey, conditionValues, op, isTranslation);
        
        if (!r && isTranslation)
            op->Commit();

        delete op;
        return r;
    }
  • 其中,保证容器性能,采取初始化列表方式使用vector,例vector{warnNull};

至此,完成修改数据库接口,上层界面可以调用GetLifetime()及SetWarnAndStopLifeTime用于读取数据库及写入数据库操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

成长记录——数据库获取数据转换格式并暴露接口 的相关文章

随机推荐

  • 剑指 Offer 43. 1~n整数中1出现的次数 思路整理

    题目描述 输入一个整数 n 求1 n这n个整数的十进制表示中1出现的次数 例如 输入12 1 12这些整数中包含1 的数字有1 10 11和12 1一共出现了5次 原题链接 https leetcode cn com problems 1n
  • 【腾讯云 Cloud Studio 实战训练营】用于编写、运行和调试代码的云 IDE泰裤辣

    文章目录 一 引言 二 什么是腾讯云 Cloud Studio 三 Cloud Studio优点和功能 四 Cloud Studio初体验 注册篇 五 Cloud Studio实战演练 实战篇 1 初始化工作空间 2 安装 antd mob
  • kaggle资源

    2019 03 07 这里记录几个认为比较好的kaggle kernel 有些是数据分析 有些是针对算法 1 COMPREHENSIVE DATA EXPLORATION WITH PYTHON 这个kernel通过对变量分析 他的数据集都
  • (Java)leetcode-23 Merge k Sorted Lists(合并K个排序链表)

    题目描述 合并 k 个排序链表 返回合并后的排序链表 请分析和描述算法的复杂度 示例 输入 1 gt 4 gt 5 1 gt 3 gt 4 2 gt 6 输出 1 gt 1 gt 2 gt 3 gt 4 gt 4 gt 5 gt 6 思路1
  • Vue项目点击侧边栏展开与折叠功能

    注 带这个符号必须要有的 路由配置 path App name App component gt import App vue 首页App vue
  • 交叉编译(全志)

    文章目录 一 交叉编译概念 二 香橙派交叉编译 3 带WiringPi库的交叉编译 一 交叉编译概念 交叉编译 就是 在一种平台上编译 编译出来的程序 是放到别的平台上运行即编译的环境 和运行的环境不一样 属于交叉的 例 在进行嵌入式开发时
  • 程序员或IT从业者笔记软件大观

    苹果 橘子 梨 好多啊 呵呵 哦不对 我要说的 不是种种水果 而是各式各样的笔记软件 你会不会陷入选择恐惧症呢 不过道理是差不多的 那就是 青苹果 红苹果 或者烂苹果 在选择的过程中 除了传统的Word WPS 其它的你可能也都会尝一尝 好
  • 云原生架构体系

    云原生 Cloud Native 的概念在国内提及的越来越多 但大部分人对云原生的认识仅限于容器 微服务 DevOps等内容 把容器 微服务 DevOps就等同于云原生 这显然是不对的 CNCF从其自身的角度定义了云原生技术 云原生技术使企
  • Windows下安装Android Studio

    一 下载Android Studio 官网地址 http www android studio org 个人也推荐使用官网推荐的 可以省去一定的步骤跟麻烦 二 安装Android Studio 这里选择下路径 当然也可以不用进行修改 因为我
  • java开发不会找错怎么办_Java开发中常见错误及规避技巧

    原标题 Java开发中常见错误及规避技巧 在开发Java软件时可能会遇到许多类型的错误 但大多数可以避免 我们列举了50个最常见的Java软件错误 其中包含代码示例和教程 以帮助您解决常见的编码问题 编译器错误 编译器错误消息在Java软件
  • webAR涉及的技术

    1 技术体系 1 1技术体系整理 其中绿色底色的代表Demo中表现出的能力比较成熟 可以直接应用 脑图地址 http naotu baidu com file 3392a895a903972520b2f65fda12ee3c token 5
  • C++模板特化与部分特化(偏特化)

    模板即是对类型的一种泛化 当我们的模板对某种特定类型有特定的实现时 模板特化即是一个很好的解决方案 一 模板特化 template
  • Python Web执行迁移文件命令

    在 Python 中执行迁移文件的命令通常是使用 Django 的 migrate 命令 要使用 migrate 命令 首先需要确保你已经在 Django 项目的根目录下 然后运行以下命令 python manage py migrate
  • C语言%lld、%llu无法正常输出比long long长整数小的数

    lld和 llu是长整型变量long long的格式化字符 用来输出有符号和无符号长整型数据 printf longlong max lld min lld LLONG MAX LLONG MIN printf nunsigned long
  • 【factoryio】虚拟仓储实现(入仓&出仓)

    实现虚拟工厂场景之一的智能仓储实验 注 本文仅供参考 目录 引 入仓部分 1 上料部分 1 效果 2 实现 2 入仓部分 1 效果 2 实现 3 入仓扩展 1 行列控制和优先级 2 入仓优化和完善 出仓部分 1 出仓 2 后传送带 3 出仓
  • Unity 四元数和向量相乘

    Unity 四元数和向量相乘 原创 2016年12月08日 16 51 35 标签 unity3d position rotation Vector3 0 0 0 0 distance target position 这是相机环绕的一段代码
  • UTM投影

    转载 https www sohu com a 297391828 169228 UTM 投影是一种等角横轴割圆柱投影 圆柱割地球于南纬80度 北纬84度两条等高圈 UTM采用了网格的分带 或分块 UTM是由美国制定 因此起始分带并不在本初
  • qt源代码在线查看

    说明 有时候需要查看qt源代码的实现 但是qt项目本身过于庞大 打开太麻烦了 但是在软件的开发中 最多跳转到qt源代码的头文件部分 在线查看qt源代码的链接 链接如下 https code woboq org qt5 功能介绍 查看代码结构
  • 自己归纳整理的ARM THUMB指令机器码表

    有个项目需要分析ARM THUMB指令的机器码 网上没有搜索到整理好的机器码表 只好自己把相关指令的机器码归纳整理出来 这里分享给大家 THUMB指令并不多 只有六十多条 这个数字真的是非常了不起 51都一百三十多条呢 可能这张表对于大多数
  • 成长记录——数据库获取数据转换格式并暴露接口

    需求 新功能增加 完成软件新界面增加 包含逻辑与数据 实现 获取数据库内容 为接口定义对应的数据格式 完成数据结构组成 数据获取接口实现 数据更改后写入数据库接口实现 获取数据库内容 首先 已经默认拥有了数据库 并内部已有数据 定义数据接口