Как отделить в этом случае

Например, следующий фрагмент кода выполняет следующие действия: сначала считывает данные из базы данных, затем преобразует данные и, наконец, записывает результаты обратно в базу данных. Более конкретно:

  1. Считайте данные из базы данных и сохраните их в записи класса А за записью.
  2. Преобразуйте данные, хранящиеся в записи класса A, по записи, класс B выполняет эту работу.
  3. Сохраните все результаты в QVariantList и запишите их в базу данных.

Проблема в тесной связи между классом A, классом B и классом ReadTransWrite
если я хочу добавить переменную-член A4 в класс A, нужно изменить 3 класса.
см. комментарий, начинающийся с «// ->»

Как отделить? Любой шаблон будет рекомендоваться? Любое предложение?

Snippet:

class A {
public:
void trans(QSqlQuery query){
A1 = query.record().field("A1").value().toString();
A2 = query.record().field("A2").value().toDate();
A3 = query.record().field("A3").value().toInt();
//--> A4 = query.record().field("A4").value().toDouble();
}
public:
QString A1;
QDate A2;
int A3;
//--> double A4;
};

class B {
public:
void trans(const A& a){
B1 = A1;
B2 = A2;
B3 = A3;
//--> B4 = A4;
}
public:
QString B1;
QDate B2;
int B3;
//--> double B4;
};

class ReadTransWrite {
.....
void do();
.....
}

void ReadTransWrite::do(){
....
// prepare for batch insert into the database
QVariantList B1s;
QVariantList B2s;
QVariantList B3s;
//--> QVariantList B4s;

A a;  // read record by record from data base
B b;  // transform the results record by record

QString sql_read = "select A1, A2, A3 from table0";
//--> QString sql_read = "select A1, A2, A3, A4 from table0";
QSqlQuery query_read;
query_read.exec(sql_read);
while(query_read.next()){
a.trans(query_read);    // read record by record from data base
b.trans(a);             // transform the results record by record
B1s.push_back(b.B1);
B2s.push_back(b.B2);
B3s.push_back(b.B3);
//--> B4s.push_back(b.B4);
}

QSqlQuery query_write;
QString sql_write = "insert into table (B1, B2, B3) values (:B1, :B2, :B3)";
//--> QString sql_write = "insert into table (B1, B2, B3, B4) values (:B1, :B2, :B3, :B4)";
query_write.prepare(sql_write);

query_write.bindValue(":B1",B1s);
query_write.bindValue(":B2",B2s);
query_write.bindValue(":B3",B3s);
//--> query_write.bindValue(":B4",B4s);

query_write.execBatch();
}

2

Решение

Вы можете сделать класс А вот так:

#include <QtCore/QVariant>
#include <QtSql/QSqlRecord>

class A
{
public:
void fillFromRecord( const QSqlRecord& record )
{
for( int iColumn = 0; iColumn < record.count(); iColumn++ )
{
_contentMap.insert(
record.fieldName( iColumn ),
record.value( iColumn )
);
}
}

inline QVariantMap getContentMap() const { return _contentMap; }

private:
QVariantMap _contentMap;
};

Примечание: я не тестировал этот код на наличие ошибок компиляции, но он должен дать вам хотя бы общее представление.

Таким образом, класс A никогда не изменится при изменении базы данных.

Также обратите внимание, как вы можете просто попросить QSqlRecord а не QSqlQuery работать больше к Закону Деметры, который sehe ссылка в комментарии.

Вы можете изменить тип карты для своих нужд, например, QHash< int, QVariant>, который хранит только индексы столбцов, а не имена, и не требует дополнительной функциональности QMap (сортировка в основном), также может быть достаточным.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]