LINUX.ORG.RU

Хранение данных в классе Qt

 , ,


0

1

А не подскажете, как лучше хранить данные в классе в такой задаче?

Предположим нужен класс, который делает экспорт из текстового файла данные в SQLite и там допустим есть такие данные:

class Converter
{
   struct TStudent {
        QString m_FirstName;
        QString m_LastName;
        QDate m_Birthday;
        int m_Sex;
        int m_Mark;
   };
   using TStudentMap = QMap<int, TStudent>;
public:
   explicit Converter(QObject *parent = nullptr);

   void exportDB(const TStudentMap &student);
   TStudentMap importDB();
// ...
// далее пишем сеттеры/геттеры и другие полезные методы
};

Или не мучатся со структурой и просто всё записать в QVariant?

class Converter
{
   using VariantMap = QMap<int, QVariant>;
   QHash<int, VariantMap> m_Student;
public:
   explicit Converter(QObject *parent = nullptr);

   void exportDB(const QVariant &student);
   QVariant importDB();
// ...
// далее пишем сеттеры/геттеры и другие полезные методы
};

Всё равно потом вставлять всё в sql-запрос в виде строк…

У второго варианта удобнее обрабатывать столбцы таблицы, так как можно просто зарядить их в цикл и просто вызвать:

query.bindValue(column, m_Student[row].value(column));

А может ещё какие то варианты есть?

★★★★

Если тебе просто перегнать одноразовую структуру, то зачем тебе хранить вообще карту студентов? Храни максимум одного студента, формируй запрос на вставку, и далее обрабатывай нового студента. Лучше классом, с проверкой полей в сеттерах, и что бы можно было добавить методы для каких то преобразований.

Если вопрос в целом про классы и sql то

1. Не делай поля класса как QHash, будешь совершать ошибки из за того что поля не проверяются компилятором, это медленно, и самое главное, при изменении таблицы студентов все сломается, например перенесешь поля из `student` в какой нибудь `personal_info` общий для всех людей, а не только студентов.

2. Не думай что таблицы это объекты из С++, ты в SQL запросе можешь получать пол таблицы оттуда, пол таблицы отсюда, и с этим тоже надо как то работать.

Поэтому лучше перейти от мышления объектами к мышлению действиями над объектами.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)

Зависит от того, что надо делать с данными. Исходные — в текстовом виде, SQL-запрос — тоже текстовая строка (ну, параметры запроса, может и QVariant, щас не помню точно). Если на этапе преобразования с ними ничего, как с числами, делать не надо (типа проверки значений), то нафига лишние преобразования.

alegz ★★★★
()
using VariantMap = QMap<int, QVariant>;

Почему не QMap<QString, QVariant> ? Тебе же нужны свойства по имени (типа «sex», «age», etc) или нет?

QHash<int, VariantMap> m_Student; 

Хэш таблица из бинарных деревьев, тебе точна такая структура нужна?

Вообще, если в коде где-то нужно будет работать с этими полями, то мне первый вариант больше нравится.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)