QsqlDatabaseНе удается открыть существующий файл. Файл является частью ресурсов QT. Если я использую адрес файла в соответствии с ресурсами, я получаю сообщение об ошибке. Если я использую абсолютный адрес, он работает нормально. Я убедился, что файл существует и путь правильный.
const QString DRIVER("QSQLITE");
assert( QSqlDatabase::isDriverAvailable( DRIVER ) );
m_db = QSqlDatabase::addDatabase( DRIVER );
// const QString fileName = "/Users/user.name/Projects/TraiMed/TraiMed/Data/DB/Users.db
const QString fileName = ":/Databases/Data/DB/Users.db";
m_db.setDatabaseName( fileName );
qDebug() << m_db.databaseName();
QFile file( fileName );
if ( file.exists() )
qDebug() << "File exists!";
if ( ! m_db.open() )
{
qDebug() << "Error: connection with database failed ";
qDebug() << m_db.lastError();
assert( false );
}
else
{
qDebug() << "Database: connection ok";
}
Результат выглядит как
":/Databases/Data/DB/Users.db"
File exists!
Error: connection with database failed
QSqlError("14", "Error opening database", "unable to open database file")
Assertion failed: (false), function DbManager, file ../DBManager.cpp, line 27.
21:40:07: The program has unexpectedly finished.
Я не думаю, что вы можете использовать для этого ресурс Qt. Вы можете извлечь ресурс и сохранить файл во временном расположении, а затем использовать этот временный файл.
Всегда ли все ресурсы QT доступны только для чтения?
Они должны быть, потому что тогда это будут самомодифицирующиеся исполняемые файлы. Однако я не думаю, что только чтение - единственная проблема. Я считаю, что проблема в том, что код SQLITE не поддерживает использование ресурса Qt. Чтобы добавить для этого поддержку, потребуются большие усилия и небольшая награда. Я говорю "небольшое вознаграждение" из-за проблемы только для чтения.
Дополнительное обсуждение ресурса sqlite / qt можно найти здесь





Насколько мне известно, базы данных SQLite раньше не могли храниться в системе ресурсов Qt. Технически они могут использоваться только как файл, доступный только для чтения, и поэтому функции sql не могут его использовать.