2016-10-19 15 views
7

.qrc içinde :/test.sqlite3 veritabanım var. Ve amaç, bu veritabanını programda doğrudan kullanmaktır. Veritabanı sadece okumak için kullanılır.Veritabanını RAM'da VFS ile depolamak için herhangi bir Qt SQLite eklentisi var mı (Qt kaynak dosyasından veritabanı yüklemek için)?

QSqlDatabase::setDatabase(":/test.sqlite3") değil eserler, Qt SQLite QT'ın dosya sistemi ile çalışmak için tasarlanmamış çünkü. Çözümlerden biri, .qrc numaralı veritabanından D:\temdb.sqlite3 veritabanına kopyalamak ve QSqlDatabase::setDatabase("D:\\temdb.sqlite3") ile kullanmaktır. Ancak program OS dosya sistemi ile çalışmaz.

İkinci çözüm, :/dump.sql kaynaklarında saklanıyor, daha sonra QSqlDatabase::setDatabase(":memory:") tarafından bellek içi veritabanı oluşturuluyor ve :/dump.sql satırlarını okuyarak ve yürüterek dökümün içine içe aktarılıyor. Ancak bu yöntem yavaştır.

Son olarak, zor ama gerçek yolu,baytımız olan RAM'den veritabanı okumak için VFS uygulamasıyla SQLite için kendi Qt eklentisini oluşturuyor.

Başka bir kolay yol var mı?

P.S. Zaten Converting in-memory sqlite database to blob/char array ve diğer tüm soruları okudum, bu yüzden çift olarak işaretlemeyin. Sorum şu başka yöntemler hakkında.

+0

"Kolay" yolu, no. Ama Sqlite kendi VFS soyutlamasıyla gelir, bu yüzden teoride QT'nin kaynaklarına doğrudan bakmak mümkündür. – peppe

+0

@peppe Herhangi bir örnek var mı? Henüz kimsenin kodlamadığına inanamıyorum :) – Rinat

+0

Tüm veri kümesini bellekte tutmayı planlıyorsanız, erişmek için SQL'i kullanmanız muhtemelen en az etkili olan rotadır. Verileri doğrudan normal C++ kapsayıcılarına okuyabilir ve çok daha iyi erişim sürelerinden yararlanabilirsiniz. – dtech

cevap

1

Verilerinizi kopyalamak ve başlatmak için Qt QTemporaryFile'dan yararlanabilirsiniz. QTemporaryfile her os üzerinde çalışır.

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(); 
} 

Eğer QSqlDatabase dosyayı tmpFile.fileName() yeniden açabilirsiniz:

İşte

(bu geçici dosya uygulamadan çıktığınızda kaldırılır böylece tüm qApp ile ilişkilendirilir) bir örnektir
QSqlDatabase::setDatabase(tmpFile.fileName()); 
+0

Teşekkür ederim, 'QTemporaryFile' hakkında daha önce bilmiyorum. Ancak, yazdığım gibi, program OS dosya sistemi ile çalışmaz. – Rinat

+0

Tamam, sadece os-spesifik bir uygulama istemediğini düşündüm, ancak bir çapraz platform. – bibi