QtでSQliteデータベースを処理するこのクラスDatabaseManagerがあります。問題は、データベースにレコードが含まれていてもクエリが「No query Unable to fetch row」を返し、何も返さない場合があり、クエリが完全に正常に動作する場合があります。この問題を解決するのに役立ちますか?
ここにクラスがあります:
class DatabaseManager
{
private:
QSqlDatabase PatternLibrary;
QSqlQuery query;
public:
Pattern pattern;
std::vector<Pattern> allPatterns;
std::vector<QString> patternNames;
std::vector<RECTANGLE> rectangles_;
DatabaseManager()
{
PatternLibrary = QSqlDatabase::addDatabase( "QSQLITE" );
PatternLibrary.setDatabaseName("mydb");
bool opened = PatternLibrary.open();
query = QSqlQuery(PatternLibrary);
if(opened)
{
qDebug( "Connected!");
query.prepare( "CREATE TABLE IF NOT EXISTS Pattern (patternName VARCHAR(30),RectangleID INTEGER ,X1 INTEGER, Y1 INTEGER, X2 INTEGER, Y2 INTEGER,X3 INTEGER,Y3 INTEGER, X4 INTEGER, Y4 INTEGER,PRIMARY KEY (patternName,RectangleID))" );
bool create = query.exec();
if(!create)
{
qDebug() <<PatternLibrary.lastError().text();
}
}
else
{
qDebug() << PatternLibrary.lastError().text();
qFatal( "Failed to connect." );
}
query.clear();
}
//******************************************************************************//
bool select_all_records()
{
query = QSqlQuery(PatternLibrary);
query.clear();
if(PatternLibrary.open())
{
query.prepare( "SELECT* FROM Pattern");
if(!query.exec())
{
qDebug() << query.lastError().text();
query.clear();
return false;
}
else
{
int PatternCount=0;
QString temp1="",temp2="";
patternNames.clear();
while( query.next() )
{
temp1 = query.value(0).toString();
if(temp1 !=temp2)
{
PatternCount++;
temp2 = temp1;
patternNames.push_back(temp1);
}
RECTANGLE Rect;
Rect.patternName = query.value(0).toString();
Rect.rectangleId = query.value(1).toInt();
Rect.X1 = query.value(2).toInt();
Rect.Y1 = query.value(3).toInt();
Rect.X2 = query.value(4).toInt();
Rect.Y2 = query.value(5).toInt();
Rect.X3 = query.value(6).toInt();
Rect.Y3 = query.value(7).toInt();
Rect.X4 = query.value(8).toInt();
Rect.Y4 = query.value(9).toInt();
rectangles_.push_back(Rect);
}
for(unsigned int i =0;i<patternNames.size();i++)
{
Pattern newPattern;
newPattern.PatternName = patternNames.at(i);
for(unsigned int j =0;j<rectangles_.size();j++)
{
if(rectangles_[j].patternName == newPattern.PatternName)
{
newPattern.pattern_.push_back(rectangles_[j]);
rectangles_.erase(rectangles_.begin()+j);
j--;
}
}
allPatterns.push_back(newPattern);
}
query.clear();
return true;
}
}
query.clear();
qFatal( "Can't Open database" );
return false;
}
//************************************************************//
ここに私のメインがあります:
int main()
{
DatabaseManager *mydbmanager = new DatabaseManager();
bool b = mydbmanager-> select_all_records(); //returns false and "No query Unable to fetch row"
}