Я пытаюсь создать конструктор, который будет заполнять данные из базы данных sqlite. Все, кажется, работает, когда я запускаю цикл for, который создает объекты и заполняет таблицу. Я получаю какой-то странный вывод. Я думаю, что это может иметь какое-то отношение к указателям на память, но я очень новичок в C++, и я не уверен, что я сделал не так.C++ Странный текст из SQLIte
Inventory Конструктор
Inventory::Inventory(int id)
{
CC_Number cn;
char result[100]; // array to hold the result.
strcpy(result,"SELECT * FROM Inventory Where Inventory_ID = ");
strcat(result,cn.int_to_char(id));
strcat(result,";");
db = new CC_Database("CC_Prepper_Inventory.sqlite");
vector<vector<string> > r = db->query(result);
db->close();
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it)
{
vector<string> row = *it;
CC_String cs;
setInv_ID(atoi(cs.toConChar(row.at(0))));
Item item(atoi(cs.toConChar(row.at(1))));
setItem(item);
setQnty(atof(cs.toConChar(row.at(2))));
Location loc(atoi(cs.toConChar(row.at(3))));
setLoc(loc);
}
}
товара Конструктор
Item::Item(int id)
{
CC_Number cn;
char result[100]; // array to hold the result.
strcpy(result,"SELECT * FROM Item Where Item_ID = ");
strcat(result,cn.int_to_char(id));
strcat(result,";");
db = new CC_Database("CC_Prepper_Inventory.sqlite");
vector<vector<string> > r = db->query(result);
db->close();
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it)
{
vector<string> row = *it;
CC_String cs;
setItem_ID(atoi(cs.toConChar(row.at(0))));
setCat_ID(atoi(cs.toConChar(row.at(1))));
setItem_Name(cs.toConChar(row.at(2)));
}
}
Расположение Constructor
Location::Location(int id)
{
CC_Number cn;
char result[100]; // array to hold the result.
strcpy(result,"SELECT Loc_ID, Loc_Name FROM Location Where Loc_ID = ");
strcat(result,cn.int_to_char(id));
strcat(result,";");
db = new CC_Database("CC_Prepper_Inventory.sqlite");
vector<vector<string> > r = db->query(result);
db->close();
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it)
{
vector<string> row = *it;
CC_String cs;
setLoc_ID(id);
setLoc_Name(cs.toConChar(row.at(1)));
}
}
Категория Конструктор
Category::Category(int id)
{
CC_Number cn;
char result[100]; // array to hold the result.
strcpy(result,"SELECT * FROM Category Where Cat_ID = ");
strcat(result,cn.int_to_char(id));
strcat(result,";");
db = new CC_Database("CC_Prepper_Inventory.sqlite");
vector<vector<string> > r = db->query(result);
db->close();
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it)
{
vector<string> row = *it;
CC_String cs;
setCat_ID(id);
setCat_Name(cs.toConChar(row.at(1)));
}
}
For Loop Используется для вызова Конструкторы
void MainWindow::fillTable()
{
ui->mainTable->clear();
db = new CC_Database("CC_Prepper_Inventory.sqlite");
vector<vector<string> > result = db->query("SELECT Inventory_ID FROM Inventory;");
db->close();
ui->mainTable->setRowCount(result.size());
int j = 0;
for(vector<vector<string> >::iterator it = result.begin(); it < result.end(); ++it)
{
vector<string> row = *it;
Inventory i(atoi(cs.toConChar(row.at(0))));
cout << i.getItem().getItem_Name() << endl;
cout << i.getItem().getCategory().getCatName() << endl;
cout << cn.dbl_to_char(i.getQnty()) << endl;
cout << i.getLoc().getLocName() << endl;
QTableWidgetItem *newItem1 = new QTableWidgetItem(QString::fromStdString(i.getItem().getItem_Name()));
QTableWidgetItem *newItem2 = new QTableWidgetItem(QString::fromStdString(i.getItem().getCategory().getCatName()));
QTableWidgetItem *newItem3 = new QTableWidgetItem(QString::fromStdString(cn.dbl_to_char(i.getQnty())));
QTableWidgetItem *newItem4 = new QTableWidgetItem(QString::fromStdString(i.getLoc().getLocName()));
ui->mainTable->setItem(j,1,newItem1);
ui->mainTable->setItem(j,2,newItem2);
ui->mainTable->setItem(j,3,newItem3);
ui->mainTable->setItem(j,4,newItem4);
i.clear();
j++;
}
QStringList qsl;
qsl << "Item" << "Category" << "Quantity" << "Location";
ui->mainTable->setHorizontalHeaderLabels(qsl);
}
Вот выход, когда я COUT результаты.
Food
1
B.O.L.
Food
3
B.O.L.
Food
4
0�an error
Food
3.14
LE Item (
Item_ID INTEGER PRIMARY KEY AUTOINCREMENT,
Cat_ID INTEGER NOT NULL,
Item_Name TEXT NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)� ��
Food
5
Я знаю, что это информационная перегрузка, но я не знаю, как еще объяснить мой вопрос.
Я сузил функцию FillTable как и все печатает хорошо, пока я не использовать i.getItem(). getItem_Name() и i.getLoc(). getLocName () Все остальные функции работают нормально. Может быть, потому, что эти переменные являются const char * – Talon06
Вот и я изменил их на строки, и теперь это работает. Я сделал их const char *, потому что мне постоянно приходилось преобразовывать строки, и это, казалось, спасло шаг. Теперь я знаю лучше. Спасибо, – Talon06