Здравствуйте, создаю приложение, которое работает с БД. БД представляет собой данные о школе(ученики, сотрудники школы, классы, родители учеников и т.д.). И вот в процессе разработки возник у меня вопрос... Как лучше работать с БД есть 2 варианта:
Это связывать все с базой напрямую к примеру... Если нужно отсортировать таблицу, то пишем запрос к БД, принимаем данные от БД и обновляем таблицу. Точно также поступаем и с добавление удалением, поиском и т.д., т.е. суть заключается в постоянном большом потоке обменов данных с БД.
...
void StaffsForm::updateTableModel(QString &stringQuery)
{
model->removeRows(0, model->columnCount());
QSqlQuery query = dataBase->execS(stringQuery);
for(size_t row = 0; query.next(); row++)
{
for(size_t col = 0; col < model->columnCount() ; col++)
{
QStandardItem *item = new QStandardItem(query.value(col).toString());
model->setItem(row, col, item);
//освобождается память в другом месте
}
}
}
...
void StaffsForm::clickedBtnDel()
{
QModelIndexList selectedRows = getSelectedRows();
if(!selectedRows.size() == 0)
{
QMessageBox::StandardButton confirm = FormProperties::Confirm("Действительно хотите удалить сотрудника?");
if(confirm == QMessageBox::Yes)
{
ui->statusbar->showMessage("Удаление из базы данных сотрудника(ов) ");
for(size_t i = 0; i < (size_t)selectedRows.size(); i++)
{
QString name = selectedRows.at(i).data().toString();
ui->statusbar->showMessage(ui->statusbar->currentMessage() + " | " + name);
dataBase->execDelete("DELETE FROM staffs WHERE name = '" + name + "'");
}
this->updateTableModel(commonQuery);
}
}
else
{
FormProperties::WarnMessage("Не выделена строка, либо выделена не целиком.");
}
}
Можно сделать класс моделей к примеру Сотрудника, в нем хранить данные о сотруднике, потом создать класс в котором будет храниться вектор этих объектов, которые будут заполнены с БД. Ну и уже с ними производить сортировку поиск и т.д.. Но а если уже добавление либо удаление, то понятно дело добавляем либо удаляем данные из/в списке и пишем запрос на добавление либо удаление данных в БД.
class Staff : public Models
{
private:
QString name;
QString number;
QString address;
QString personalData;
QString dateOfBirth;
QString profession;
QString predmet;
Staff(QString &name, QString &number, QString &address, QString &personalData,
QString &dateOfBirth, QString &profession, QString &predmet);
public:
class Builder {
QString name;
QString number;
QString address;
QString personalData;
QString dateOfBirth;
QString profession;
QString predmet;
public:
// setters
Staff* build();
};
// getters
};
...
void StaffsModel::fillItems()
{
QSqlQuery query = dataBase->execS(commonQuery);
while(query.next())
{
Staff *staff = Staff::Builder()
.setName(query.value(0).toString())
.setNumber(query.value(1).toString())
.setAddress(query.value(2).toString())
.setPersonalData(query.value(3).toString())
.setDateOfBirth(query.value(4).toString())
.setPredmet(query.value(5).toString())
.setProfession(query.value(6).toString())
.build();
staffs.append(staff);
}
}
void StaffsModel::updateDataInTable()
{
model->removeRows(0, model->columnCount());
for(size_t row = 0; row < staffs.size(); row++)
{
Staff *staff = staffs.at(row);
model->setItem(row, 0, new QStandardItem(staff->getName()));
model->setItem(row, 1, new QStandardItem(staff->getNumber()));
model->setItem(row, 2, new QStandardItem(staff->getAddress()));
model->setItem(row, 4, new QStandardItem(staff->getPersonalData()));
model->setItem(row, 4, new QStandardItem(staff->getDateOfBirth()));
model->setItem(row, 5, new QStandardItem(staff->getPredmet()));
model->setItem(row, 6, new QStandardItem(staff->getProfession()));
}
}
...
Не могу понять как это лучше делать и кой из методов является костыльным, может кто-нибудь подскажут?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте! Как заменить пробелы символом “$” с помощью функций и манипуляторов?
Только учусь winAPI, весь вечер вчера пытался написать программу, которая бы выключала экран и включала при нажатие на клавишу F2, код нижеПроблема...
Например, есть цикл перевода YUY2 буфера в буфер BGR (от 100 до 900+ тысяч итераций):
Как можно заменить strcpy не теряя работоспособности?