我有一个奇怪的问题。无法在c ++ / Qt上添加sqlite / Write函数。 函数应该在Utf-8符号上面做;
this->db = QSqlDatabase::addDatabase("QSQLITE");
this->db.setDatabaseName(db);
this->db.open();
QVariant v = this->db.driver()->handle();
sqlite3 *handler = *static_cast<sqlite3 **>(v.data());
sqlite3_create_function( handler, "myUpper", 1, SQLITE_ANY, NULL, myFunc, NULL, NULL )
,功能是:
void myFunc( sqlite3_context * ctx, int argc, sqlite3_value ** argv )
{
if( argc != 1 ) return;
QString str;
switch(sqlite3_value_type(argv[0]))
{
case SQLITE_NULL:
{
sqlite3_result_text( ctx, "NULL", 4, SQLITE_STATIC );
break;
}
case SQLITE_TEXT:
{
QString wstr((char*)sqlite3_value_text16(argv[0]));
wstr = wstr.toUpper();
sqlite3_result_text16( ctx, wstr.toStdString().c_str(), wstr.size() , SQLITE_TRANSIENT );
break;
}
default:
sqlite3_result_text( ctx, "NULL", 4, SQLITE_STATIC );
break;
}
}
答案 0 :(得分:2)
你没有指定问题,但我想你应该传递一个指向函数的指针:
sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, &myFunc, NULL, NULL)
编辑: 我要传递给函数wstr.toStdString()。c_str()。这是不允许的,因为返回的指针只是临时的,并且将超出范围。我会做的是:
...
case SQLITE_TEXT: {
QString wstr((char*)sqlite3_value_text(argv[0]));
wstr = wstr.toUpper();
QByteArray array = wstr.toLocal8Bit();
const char* cstr = array.data();
sqlite3_result_text(ctx, cstr, wstr.size() , SQLITE_TRANSIENT);
break;
}
...
我没试过,所以检查一下。