Можно ли инициализировать статическое поле класса значением из БД
Дано: 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 шт):
Как обычно дело было не в бобине. При создании подключения к базе данных функция обращалась к переменной пути до этой базы которой на тот момент не существовало.
Ну ОК. Ответ: можно. Для этого надо всего лишь...
... не быть криворуким дебилом как я. Понятно было, что несколько раз вызывать QSqlDatabase::addDatabase() не лучшая идея. Что в комментарии по своей ссылке хотел сказать magrif я так и не догнал, но вот это было понятно. Запилил вариант Мэйерса, в конструктор по умолчанию кинул подключение к БД, getInstance() в magicCell(). Подключение стало запускаться только один раз, но основную проблему это не решило, программа все также падала. И тут меня осенила гениальная мысль о существовании отладки. Как только выполнение замерло на строчке
db.setDatabaseName(getDBPath().absolutePath() + '/' + "data.db");
я понял что структура path, где должны находиться директории, объявлена static в другом файле, а какие то осмысленные значения в ней появляются только в функции main(). Не долго думая применил тот же патерн для присвоения значений путей полям этой структуры и все заработало. Осталось только понять как получить директорию приложения до запуска main() для полного счастья.