
我的代码中的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.hmain.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应用程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)