菜单

SQLite数据库操作

下载

介绍

本 IDE 内置 sqlite 数据库为默认数据库。下面将着重讲解如何通过代码进行创建,以及如何对表进行增删改查

每项工程,都会创建一个名为default.db的 sqlite 数据库,里面包含系统文件库,非自创表谨慎操作。下面所有的操作流程都是以默认数据库为案例讲解的。

创建表

通过软件进行表创建

如果手头上有DB Browser for SQLite或者navicat等专业数据库操作工具,可以将项目中的default.db拖拽至软件中打开,在里面按照数据库建表流程进行建表即可。

通过代码创建

  1. 在页面/全局上创建一个数据库指针。在页面上创建的只能在当前页面使用,在全局创建的可以通过hmiApp->db来调用,以下代码将描写一个全局的数据库指针。
c++ 复制代码
HmiApp.h 文件
/*CUSTOM_CODE_BEGIN*/
IDatabase * db = nullptr;
/*CUSTOM_CODE_END*/
c++ 复制代码
HmiApp.c 文件
void HmiApp::onReady(){
  db = DBMgr::getdb();
  if (db == nullptr){
    cout<<"连接失败"<<endl;
    return;
  }
}

如果想换成其他的数据库,可以根据 getdb 函数的解析进行修改。

c++ 复制代码
/**
 * @LEVEL0
 * @brief 动态加载对应的动态库后,打开并连接数据库。如dbid已经存在,则直接已经存在的数据库类指针
 * 若dbid已存在,则取相应的数据库连接。若不存在,先根据后面的参数连接,再取该连接
 * 全部为默认值时,即getdb(),取系统的sqlite数据库(default.db)
 * @param dbid 		自定义的id。不为空时其他(MYSQL,PG,MSSQL,REDIS)数据库,为空时,取系统的默认sqlite数据库default.db
 * @param dbtype	数据库类型,见常量DBTYPE(支持sqlite,mysql,mssql,postgre,redis)
 * @param url		数据库服务器ip。其中:当dbtype==T_SQLITE时,为文件路径。
 * 		当dbtype==T_POSTGRESQL时为连接串,如("host=127.0.0.1 port=5432 dbname=msdf user=postgres password=123456)
 * @param port		端口号。当dbtype==T_SQLITE时,无效。(mysql 3306, mssql 1433, postger 5432, redis 6379)
 * @param uid		用户名。当dbtype==T_SQLITE时,无效。注意MySQL服务器的用户验证方式要设为标准
 * @param pwd		密码。当dbtype==T_SQLITE时,无效。
 * @param dbname	数据库系统中的数据库名称。
 * @return 连接成功,返回数据库指针;连接失败,返回NULL
 *
 * @warning getdb会产生一个指针,在close后,需用delete清理
 */
static IDatabase* getdb(string dbid = "", uint8_t dbtype = DBTYPE::SQLITE3
    , string url = "", int port = 3306, string uid = "", string pwd = "", string dbname = "") ;
  1. 创建表
c++ 复制代码
string SQL;
bool res = false;
TTable tb;
// 创建自动测量时间值表
SQL = util::StringUtil::snprintf("CREATE TABLE IF NOT EXISTS warninglog("
      "id INTEGER PRIMARY KEY DEFAULT(1),"
      "beginTime varchar(64) DEFAULT('') NOT NULL," // 开始时间
      "endTime varchar(64) DEFAULT('') NOT NULL," // 结束时间
      "errorMessage varchar(64) DEFAULT('') NOT NULL" //报警内容
      ");");
res = db->execute(SQL);
if (!res){
  cout<<"warninglog create false"<<endl;
  return;
}

使用 execute 进行执行语句操作。注意:创建表语句时,表的内容为 sql 语句内容,写错则执行不成功。

执行增删改查

增/改

使用 execute 函数

c++ 复制代码
// 增加1
string SQL = StringUtil::snprintf("insert into warninglog(id) values(1);");
bool res = db->execute(SQL);

// 增加2
string sql = StringUtil::snprintf("insert into db_test(name,type,age,country,number) values ('%s',%d,%d,'%s','%s')",name.c_str(),type,age,country.c_str(),number.c_str());
bool ret = hmiApp->db->execute(sql);

注意:由于 StringUtil::snprintf 需要传入 c 风格的字符串,因此字符串的格式为'%s',值表达为 name.c_str()。

c++ 复制代码
string SQL = StringUtil::snprintf("delete from home where id=%d",id);
bool res = db->execute(SQL);

c++ 复制代码
// 该句为查询,将home表查询为封装的tbl中
TTable tbl = hmiApp->db->query("select * from home");
// 这里获取到所有的行数(不包括标题行)
vector<TTable::Row> rows = tbl.m_rows;
int rsize = rows.size();
int id = -1;
if (rsize>=1){
  for (int i = 0;i<rsize;i++){
    // 在这个home表中,第一列为id,下标从0开始
    id = StringUtil::safeStoi(rows[i].values[0]);
  }
}

和控件交互

选择控件

设置查询语句

进行表格设计

更改查询语句

如果想进入画面时,不使用默认添加的查询语句,想使用自己设计的查询语句,可以参考以下代码

c++ 复制代码
// 通用方法 可以进行任何条件的拼接 如:(select id,name,type,age,country from db_test order by id asc) Vx
newsql = StringUtil::snprintf("(select id,name,type,age,country,number from db_test where type=%d and age=%d) Vx",type,age);
tv_wMSqliteTable1->refine(newsql);

注意:使用的数据库字段必须为表格设计中的选中的数据库字段,字段必须是表中原字段,不可用as进行别名绑定。Vx为新表的别名(新表为括号里面的查询语句),可以设置任意表名作为别名

数据库数据导出

下面是导出到 u 盘的示例

c++ 复制代码
// 获取表
TTable tbl = hmiApp->db->query("select * from db_test");
vector<string> res;
// 获取u盘路径
res =SysInfo::getUdisks();
// 编辑导出文件的路径
string path = res[0]+"/BATCD_12121.csv";
// 导出表
bool ret = FileUtil::exportTableToFile(tbl, path, 0);

删除选中行

如果想删除表中某个被点击的选中行,并删除对应的数据库语句,可以进行如下操作

c++ 复制代码
void Frm03::wMButton10_clk_cb(uint16 t code, LvEvent e){
/*删除*/
  IDatabase* db = db::DBMgr::getdb("");
  intr=tv_wMSqliteTable3->getSelectedIndex();
  int mld =tv_wMSqliteTable3->getValue(r, 0);
  string sql= "delete from rptDatas where mld=" + mld;
  db->execute(sql);
  tv_wMSqliteTable3->drawData(true);
}

该表字段中必须有一个字段作为唯一标识

最近修改: 2025-07-02Powered by