Qt толстая клиентская архитектура базы данных - PullRequest
2 голосов
/ 19 августа 2010

Моя цель - создать толстый клиент для базы данных. В основном это все об управлении тремя списками данных.

Я бы хотел разделить свое приложение на разделенные слои, поэтому использование инфраструктуры Qt Model / View кажется мне естественным.

  • Когда мне следует создавать экземпляры QSql * Model?

Мне нужно иметь возможность подключаться / отключаться от базы данных несколько раз (для этого у меня есть пункты меню). Я не доволен удалением нескольких моделей и созданием их снова при каждом подключении / отключении.

Есть ли альтернативный подход?

  • Где мне создавать QSql * экземпляры модели?

Я не думаю, что MainWindow или любой другой связанный с GUI класс должен содержать код, подобный следующему:

m_goodsModel->setRelation(1, QSqlRelation("Level", "LevelId", "Name"));

Я хочу отделить графический интерфейс от структуры данных. Есть идеи как это сделать?

  • Когда и где мне связывать свои взгляды с моделями?

Мне нужно представить мои три списка дюжиной способов. Если я буду воссоздавать модели каждый раз, когда я подключаюсь / отключаюсь, мне нужно будет снова добавить вновь созданные модели во все виды.

Было бы замечательно, если бы я мог сделать это только один раз, но я понятия не имею, как.

  • Что делать с мерзким QSqlTableModel::select() методом?

Этот сводит меня с ума. В отличие от других моделей (например, QStringListModel, QFileSystemModel и т. Д.), Где данные готовы к использованию «из коробки», модели, полученные из QSqlTableModel, бесполезны, пока вы вручную не вызовете их метод select(). До этого вызова модель пуста, так как представления используют эту модель; данные заголовка также не заполняются, поэтому представление даже не знает, какие столбцы оно должно отображать.

Поскольку я не могу избежать select() вызова, мне интересно, где я должен положить его так, чтобы он хорошо подходил? Я не думаю, что MainWindow или другие классы, связанные с GUI, должны содержать этот код.

  • Производительность и надежность

Я не рад заново инициализировать все после переподключения БД. Это занимает слишком много времени (я имею в виду во время исполнения). Я также хотел бы избежать сбоев в процессе воссоздания модели, поскольку представления могут по-прежнему ссылаться на них.

Нет ли другого способа установить все только один раз и изящно обработать переподключение?

1 Ответ

1 голос
/ 20 августа 2010

Мне кажется, что прямой ответ на все эти вопросы заключается в том, чтобы обернуть все связанные с базой данных действия в выделенном классе и удерживать указатель на экземпляр этого класса в вашем MainWindow / Dialog / что угодно.

Возможный дизайн может быть примерно таким:

class DatabaseAccess : public QObject
{
       Q_OBJECT
    public:
       void connectToDatabase(const QString & hostname, const QString & db, const QString & user, const QString & password);
       void disconnectFromDatabse();

       QAbstractItemModel * getModelForX();
       QAbstractItemModel * getModelForY();

    private:
       QSqlTableModel * modelForX;
       QSqlRelationalTableModel * modelForY;
}

Здесь X и Y являются просто заполнителями для типов запросов, которые у вас есть в вашем приложении.

Вы можете создавать свои модели в connectToDatabase() и вызывать select(), когда вам нужны свежие данные в методах getModelForX / Y.

Насколько я знаю, вы не можете продолжать использовать одни и те же экземпляры модели с разными подключениями к базе данных, поскольку QSqlTableModel и его потомки привязаны к экземпляру QSqlDatabase. После успешного подключения вам необходимо обновить свои представления.

...