我有一个c ++项目,其中安装了sqlite。
当应用程序启动时,它将使用以下代码创建数据库:
// Open connection with database
if (SQLITE_OK != sqlite3_open_v2("Test.db", &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, nullptr)) {
return false;
}
// Delete old tables if exists
char * error;
if (SQLITE_OK != sqlite3_exec(db, "DROP TABLE IF EXISTS Tests;", nullptr, nullptr, &error)) {
return false;
}
// Recreate all tables
if (SQLITE_OK != sqlite3_exec(db, "CREATE TABLE Tests(testID INTEGER PRIMARY KEY ASC, name TEXT NOT NULL);", nullptr, nullptr, &error)) {
return false;
}
// Test only
if (SQLITE_OK != sqlite3_exec(db, "INSERT INTO Tests(testID, name VALUES (1, 'Andrea');", nullptr, nullptr, &error)) {
return false;
}
执行此代码时:
sqlite3_stmt *query = nullptr;
if (SQLITE_OK != sqlite3_prepare_v2(db, "SELECT testID, name FROM Tests;", -1, &query, nullptr)) {
}
unsigned char const * t = nullptr;
if (SQLITE_ROW == sqlite3_step(query)) {
t = sqlite3_column_text(query, 1);
sqlite3_finalize(query);
}
printf( (char*)t );
我期待“Andrea”但是这段代码打印出来: - PÝòea - ð¶òea - ð§òea
每次都有不同的结果。
答案 0 :(得分:2)
根据sqlite3_column_text
documentation,指针t
在sqlite3_finalize
之后变为无效:
换句话说,你应该首先调用 sqlite3_column_text(),sqlite3_column_blob()或sqlite3_column_text16()来强制结果为所需的格式,然后调用sqlite3_column_bytes()或sqlite3_column_bytes16()来查找结果的大小。
返回的指针有效,直到如上所述发生类型转换,或直到调用sqlite3_step()或sqlite3_reset()或 sqlite3_finalize()为止。
正如@tkausl所建议的那样,为了解决这个问题,你应该在sqlite3_finalize
调用之前打印数据或将其复制到某个地方以供进一步使用。