将自定义sqlite函数添加到Qt应用程序

将自定义sqlite函数添加到Qt应用程序,第1张

概述我正在尝试将自定义sqlite3 regexp函数添加到我的Qt应用程序中(按照 this answer的建议).但是当我调用sqlite3_create_function函数时,我收到消息该程序意外地完成了.当我调试时,它终止于sqlite3_mutex_enter中的分段错误.下面有一个MWE,对绝对文件路径道歉. 我的代码中的regexp实现是从this site开始的;它也与msign函数 我正在尝试将自定义sqlite3 regexp函数添加到我的Qt应用程序中(按照 this answer的建议).但是当我调用sqlite3_create_function函数时,我收到消息该程序意外地完成了.当我调试时,它终止于sqlite3_mutex_enter中的分段错误.下面有一个MWE,对绝对文件路径道歉.

我的代码中的regexp实现是从this site开始的;它也与msign函数here失败.对driver() – > handle()的各种检查直接来自Qt文档.

顺便说一下,我使用select sqlite_version();确定Qt 5.5使用sqlite版本3.8.8.2.我通过查看Qt GitHub存储库中的旧提交找到了@L_419_4@.

MWE.pro

@H_419_17@QT += core guiTARGET = MWETEMPLATE = appQT += sqlSOURCES += main.cpp \ D:\Qt\Qt5.5.0\5.5\Src\3rdparty\sqlite\sqlite3.cheaderS += D:\Qt\Qt5.5.0\5.5\Src\3rdparty\sqlite\sqlite3.h

main.cpp中

@H_419_17@#include <Qtsql>#include "D:/Qt/Qt5.5.0/5.5/Src/3rdparty/sqlite/sqlite3.h"voID qtregexp(sqlite3_context* ctx,int argc,sqlite3_value** argv){ QRegExp regex; QString str1((const char*)sqlite3_value_text(argv[0])); QString str2((const char*)sqlite3_value_text(argv[1])); regex.setPattern(str1); regex.setCaseSensitivity(Qt::CaseInsensitive); bool b = str2.contains(regex); if (b) { sqlite3_result_int(ctx,1); } else { sqlite3_result_int(ctx,0); }}int main(int argc,char *argv[]){ QsqlDatabase db = QsqlDatabase::addDatabase("QsqlITE"); db.setDatabasename("my.db"); db.open(); QVariant v = db.driver()->handle(); if (v.isValID() && qstrcmp(v.typename(),"sqlite3*")==0) { sqlite3 *db_handle = *static_cast<sqlite3 **>(v.data()); if (db_handle != 0) { // check that it is not NulL // This shows that the database handle is generally valID: qDeBUG() << sqlite3_db_filename(db_handle,"main"); sqlite3_create_function(db_handle,"regexp",2,sqlITE_UTF8 | sqlITE_DETERMINISTIC,NulL,&qtregexp,NulL); qDeBUG() << "This won't be reached." Qsqlquery query; query.prepare("select regexp('p$','tap');"); query.exec(); query.next(); qDeBUG() << query.value(0).toString(); } } db.close();}解决方法 从Qt,according to this forum post获取数据库句柄后,需要调用sqlite3_initialize().

@H_419_17@... sqlite3 *db_handle = *static_cast<sqlite3 **>(v.data()); if (db_handle != 0) { // check that it is not NulL sqlite3_initialize(); ...

这解决了这个问题.

总结

以上是内存溢出为你收集整理的将自定义sqlite函数添加到Qt应用程序全部内容,希望文章能够帮你解决将自定义sqlite函数添加到Qt应用程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/1156063.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存