2016-10-19 7 views
7

मेरे पास डेटाबेस .qrc के अंदर है। और लक्ष्य सीधे प्रोग्राम में इस डेटाबेस का उपयोग करना है। डेटाबेस केवल पढ़ने के लिए उपयोग किया जाता है।क्या VFS द्वारा रैम में डेटाबेस संग्रहीत करने के लिए कोई Qt SQLite प्लगइन है (Qt संसाधन फ़ाइल से डेटाबेस लोड करने के लिए)?

QSqlDatabase::setDatabase(":/test.sqlite3") काम नहीं करता है, क्योंकि क्यूटी SQLite Qt के फाइल सिस्टम के साथ काम करने के लिए डिज़ाइन नहीं किया गया है।

समाधानों में से एक .qrc से डेटाबेस को D:\temdb.sqlite3 में कॉपी कर रहा है और इसे QSqlDatabase::setDatabase("D:\\temdb.sqlite3") द्वारा उपयोग कर रहा है। लेकिन कार्यक्रम ओएस फाइल सिस्टम के साथ काम नहीं करना चाहिए।

दूसरा समाधान संसाधनों में :/dump.sql भंडारण है, तो QSqlDatabase::setDatabase(":memory:") द्वारा में स्मृति डेटाबेस बनाने और इसे में पढ़ने से डंप आयात और :/dump.sql से लाइनों को क्रियान्वित। लेकिन यह विधि धीमी है।

और, आखिरकार, कठिन लेकिन सही तरीका रैम से डेटाबेस पढ़ने के लिए VFS कार्यान्वयन के साथ SQLite के लिए स्वयं क्यूटी प्लगइन बना रहा है, जहां हमारे पास ":/test.sqlite3" के बाइट हैं।

क्या कोई और आसान तरीका है?

पीएस मैंने पहले से ही Converting in-memory sqlite database to blob/char array और अन्य सभी प्रश्नों को पढ़ लिया है, इसलिए इसे डुप्लिकेट के रूप में चिह्नित न करें। मेरा सवाल किसी अन्य तरीकों के बारे में है।

+0

"आसान" तरीका, नहीं। लेकिन स्क्लाइट अपने स्वयं के वीएफएस अबास्ट्रक्शन के साथ आता है, इसलिए सिद्धांत रूप में इसे सीधे क्यूटी के संसाधनों में देखना संभव है। – peppe

+0

@peppe कोई उदाहरण हैं? विश्वास नहीं कर सकता कि किसी ने अभी तक कोड नहीं किया है :) – Rinat

+0

यदि आप संपूर्ण डेटा सेट को स्मृति में रखने की योजना बनाते हैं, तो एसक्यूएल का उपयोग करके उस संभवतः कम से कम कुशल कोर्स ले सकते हैं। आप नियमित रूप से डेटा को नियमित C++ कंटेनरों में पढ़ सकते हैं और अधिक बेहतर पहुंच समय का आनंद ले सकते हैं। – dtech

उत्तर

1

आप अपने डेटा की प्रतिलिपि बनाने और शुरू करने के लिए Qt QTemporaryFile का लाभ उठा सकते हैं। QTemporaryfile प्रत्येक ओएस पर काम करता है।

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

, जिसे आप QSqlDatabase के रूप में फ़ाइल tmpFile.fileName() फिर से खोलना कर सकते हैं::

यहाँ एक उदाहरण (इस अस्थायी फ़ाइल पूरे qApp इतना है कि यह एक बार आप अनुप्रयोग से बाहर निकाल दिया जाएगा करने के लिए जुड़ा हुआ है) है

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

धन्यवाद, पहले 'QTemporaryFile' के बारे में नहीं पता है। लेकिन, जैसा कि मैंने लिखा है, प्रोग्राम ओएस फाइल सिस्टम के साथ काम नहीं करना चाहिए। – Rinat

+0

ठीक है, मैंने सोचा कि आप एक ओएस-विशिष्ट कार्यान्वयन नहीं बल्कि एक क्रॉस प्लेटफॉर्म चाहते हैं। – bibi