解析QT 使用Sqlite存儲(chǔ)讀取文件
QT 使用Sqlite存儲(chǔ)讀取文件是本文所介紹的內(nèi)容,Qt中使用第三方的數(shù)據(jù)庫(kù)(Sqlite)存儲(chǔ)并讀取文件本體,在網(wǎng)上找了一下關(guān)于如何在數(shù)據(jù)庫(kù)中存儲(chǔ)文件本體(一般是關(guān)于image)的內(nèi)容,但是發(fā)現(xiàn)大多數(shù)的做法都是存儲(chǔ)文件相應(yīng)的路徑,需要該文件的時(shí)候通過(guò)路徑查詢,感覺(jué)那樣的做法的話,文件只是在一種抽象的方式被存儲(chǔ)在了數(shù)據(jù)庫(kù)中,本體并沒(méi)有被存儲(chǔ),這樣做可能是出于效率和數(shù)據(jù)庫(kù)大小的考慮(本人對(duì)數(shù)據(jù)庫(kù)知道的不多)。因?yàn)榍岸螘r(shí)間對(duì)QT比較感興趣,然后發(fā)現(xiàn)其中可以使用第三方的數(shù)據(jù)庫(kù),于是嘗試了下。
(1)創(chuàng)建數(shù)據(jù)庫(kù)連接
- bool MyDatabase::CreateConnection()
- {
- db = QSqlDatabase::addDatabase("QSQLITE");
- db.setDatabaseName("mydb.db");
- if (!db.open()) {
- qDebug()<<" can't open database >>>>>> mydb.db";
- exit(-1);
- }
- return true;
- }
使用第三方數(shù)據(jù)庫(kù)Sqlite,數(shù)據(jù)庫(kù)名字為mydb.db,而后就是打開(kāi)數(shù)據(jù)庫(kù)了。
- bool MyDatabase::CreateTable()
- {
- QStringList tableList = db.tables();
- QSqlQuery query(db);
- if(!tableList.contains("files"))
- {
- QString createTable = "create table files (id integer primary key,"
- "filename varchar(128) unique, filecontent blob)";
- if(!query.exec(createTable))
- {
- qDebug()<<query.lastError();
- exit(-1);
- }
- }
- return true;
- }
(2)創(chuàng)建存儲(chǔ)說(shuō)需要的表
查看是否存在相關(guān)的表,不存在,則通過(guò)"create table files (id integer primary key,filename varchar(128) unique, filecontent blob)";創(chuàng)建files表。
(3)存儲(chǔ)文件名為
- bool MyDatabase::StoreFile(QString FileName)
- {
- QSqlQuery query(db);
- QFile File(FileName);
- if(File.open(QIODevice::ReadOnly)){
- QByteArray &tdata = File.readAll();
- QByteArray data = qCompress(tdata,9);
- query.prepare("INSERT INTO files (id,filename,filecontent)"
- "VALUES(NULL,:filename,:filecontent)");
- query.bindValue(":filename", FileName);
- query.bindValue(":filecontent", data);
- if(!query.exec())
- {
- qDebug()<<query.lastError();
- return false;
- }
- }
- else
- {
- return false;
- }
- return true;
- }
基本思想就是把名為FileName的文件裝換成為QByteArray,然后使用第三方的zlib進(jìn)行最高等級(jí)的壓縮,然后存儲(chǔ)
(4)從數(shù)據(jù)庫(kù)中
- bool MyDatabase::GetFile(QString FileName)
- {
- QSqlQuery query(db);
- query.prepare("select filecontent from files");
- query.exec();
- query.next();
- QByteArray tdata = query.value(0).toByteArray();
- QByteArray data = qUncompress(tdata);
- QFile File(FileName);
- if(File.open(QIODevice::WriteOnly))
- {
- File.write(data);
- File.close();
- }
- else
- {
- return false;
- }
- return true;
- }
因?yàn)閮H僅是嘗試,所以只需讀取一個(gè)并把它命名為FileName?;舅枷胧前汛鎯?chǔ)在數(shù)據(jù)庫(kù)中的內(nèi)容轉(zhuǎn)化為QByteArray,然后解壓,寫(xiě)入到文件中。
小結(jié):關(guān)于解析QT 使用Sqlite存儲(chǔ)讀取文件的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!