2016-10-19 1 views
7

У меня есть база данных :/test.sqlite3 внутри .qrc. И цель состоит в том, чтобы напрямую использовать эту базу данных в программе. База данных используется только для чтения.Есть ли какой-нибудь плагин Qt SQLite для хранения базы данных в ОЗУ с помощью VFS (для загрузки базы данных из файла ресурсов Qt)?

QSqlDatabase::setDatabase(":/test.sqlite3") не работает, потому что Qt SQLite не предназначен для работы с файловой системой Qt.

Одним из решений является копирование базы данных с .qrc в D:\temdb.sqlite3 и использование его по QSqlDatabase::setDatabase("D:\\temdb.sqlite3"). Но программа не должна работать с файловой системой ОС.

Второе решение хранит :/dump.sql в ресурсах, а затем создает базу данных в памяти на QSqlDatabase::setDatabase(":memory:") и импортирует в нее дамп, считывая и выполняя строки от :/dump.sql. Но этот метод медленный.

И, наконец, жесткий, но верный способ создания собственного Qt-плагина для SQLite с реализацией VFS для чтения базы данных из ОЗУ, где у нас есть байты ":/test.sqlite3".

Есть ли еще один простой способ?

P.S. Я уже прочитал все вопросы, такие как Converting in-memory sqlite database to blob/char array и другие, поэтому не отмечайте его как дубликат. Мой вопрос касается любых других методов.

+0

«Простой» способ, нет. Но Sqlite поставляется со своей собственной абстракцией VFS, поэтому теоретически можно заставить ее смотреть прямо в ресурсы Qt. – peppe

+0

@peppe есть примеры? Не могу поверить, что никто еще не закодировал это :) – Rinat

+0

Если вы планируете хранить весь набор данных в памяти, используя SQL для доступа, это, вероятно, наименее эффективный курс, который вы можете предпринять. Вы можете напрямую считывать данные в обычные контейнеры на C++ и получать гораздо больше времени на доступ. – dtech

ответ

1

Вы можете воспользоваться Qt QTemporaryFile, чтобы скопировать свои данные и начать работу. QTemporaryfile работает на всех os.

Вот пример (этот временный файл связан на всю qApp так, что она будет удалена, как только вы выйдите из приложения):

QTemporaryFile tmpFile(qApp); 
tmpFile.setFileTemplate("XXXXXX.sqlite3"); 
if (tmpFile.open()) { 
    QString tmp_filename=tmpFile.fileName(); 
    qDebug() << "temporary" << tmp_filename; 

    QFile file(":/test.sqlite3"); 
    if (file.open(QIODevice::ReadOnly)) { 
     tmpFile.write(file.readAll()); 
    } 

    tmpFile.close(); 
} 

вы можете открыть файл tmpFile.fileName() в QSqlDatabase:

QSqlDatabase::setDatabase(tmpFile.fileName()); 
+0

Спасибо, раньше не знаю о 'QTemporaryFile'. Но, как я писал, программа не должна работать с файловой системой ОС. – Rinat

+0

ОК, я просто подумал, что вам не нужна реализация ОС, а скорее кросс-платформенная. – bibi

Смежные вопросы