Можно ли инициализировать статическое поле класса значением из БД

Дано: Qt, SQLite. Константные статические поля класса которые прекрасно инициализируются примерно вот так:

const Cell Act::_subaccountcell = Cell("A15");

Далее делаю так:

const Cell Act::_subaccountcell = magicCell(subaccountcell);

получаю:

QSqlQuery::exec: database not open QSqlQuery::value: not positioned on a valid record ASSERT: "uint(i) < uint(size())" in file ....\Qt5.9.2\5.9.2\mingw53_32\include\QtCore/qstring.h, line 887 Invalid parameter passed to C runtime function. Invalid parameter passed to C runtime function.

Добавляю в функцию magicCell подключение к базе данных которое присутствует также в main, получаю:

The program has unexpectedly finished. Процесс был завершён принудительно.

Возвращаю инициализацию к изначальному варианту и все работает хоть и жалуется:

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.


Ответы (1 шт):

Автор решения: President Evil

Как обычно дело было не в бобине. При создании подключения к базе данных функция обращалась к переменной пути до этой базы которой на тот момент не существовало.

Ну ОК. Ответ: можно. Для этого надо всего лишь...

... не быть криворуким дебилом как я. Понятно было, что несколько раз вызывать QSqlDatabase::addDatabase() не лучшая идея. Что в комментарии по своей ссылке хотел сказать magrif я так и не догнал, но вот это было понятно. Запилил вариант Мэйерса, в конструктор по умолчанию кинул подключение к БД, getInstance() в magicCell(). Подключение стало запускаться только один раз, но основную проблему это не решило, программа все также падала. И тут меня осенила гениальная мысль о существовании отладки. Как только выполнение замерло на строчке

db.setDatabaseName(getDBPath().absolutePath() + '/' + "data.db");

я понял что структура path, где должны находиться директории, объявлена static в другом файле, а какие то осмысленные значения в ней появляются только в функции main(). Не долго думая применил тот же патерн для присвоения значений путей полям этой структуры и все заработало. Осталось только понять как получить директорию приложения до запуска main() для полного счастья.

→ Ссылка