最近因為工作原因,需要使用sqlite數據庫。sqlite數據庫小並且使用方便,感覺挺不錯的。但有一個不足就是沒有對數據庫進行加密,不過好的是sqlite預留有加密的接口,我們可以直接調用即可。我也是參考網上的資料對數據庫進行加密:
sqlite數據庫默認沒有加密功能,對一些需要對工程文件進行保密的場合產生了不便,本文以QT4.4.3為例,
對qt源代碼中的sql模塊進行修改,為qt集成的sqlite數據庫添加了加密功能.
1. /wxsqlite3_prj/sqlite3目錄 下的文件進行編譯生成 sqlite3.lib
2 將 sqlite3.h 和 上一步驟生成的sqlite3.lib 拷貝到目錄 ?:\Qt\4.4.3\src\plugins\sqldrivers\sqlite 中.
3 將 ?:\Qt\4.4.3\src\plugins\sqldrivers\sqlite 目錄下的sqlite.pro文件修改為:
TARGET = qsqlite
# 不使用qt自帶的sqilte源碼文件,而是使用外部生成的庫
win32:LIBS += sqlite3.lib
#
HEADERS = ../../../sql/drivers/sqlite/qsql_sqlite.h
SOURCES = smain.cpp \
../../../sql/drivers/sqlite/qsql_sqlite.cpp
!system-sqlite:!contains( LIBS, .*sqlite.* ) {
CONFIG(release, debug|release):DEFINES *= NDEBUG
DEFINES += SQLITE_CORE SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE
# INCLUDEPATH += ../../../3rdparty/sqlite
# SOURCES += ../../../3rdparty/sqlite/sqlite3.c
} else {
LIBS *= $$QT_LFLAGS_SQLITE
QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE
}
include(../qsqldriverbase.pri)
4 修改 ?:\Qt\4.4.3\src\sql\drivers\sqlite 目錄下的文件 qsql_sqlite.cpp
需要修改的函數 bool QSQLiteDriver::open(),函數體修改為:
bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts)
{
if (isOpen())
close();
if (db.isEmpty())
return false;
if (sqlite3_open16(db.constData(), &d->access) == SQLITE_OK) {
sqlite3_busy_timeout(d->access, qGetSqliteTimeout(conOpts));
setOpen(true);
setOpenError(false);
//添加加密功能 "Trucc"為加密密匙,5為密匙長度
sqlite3_key( d->access, "Trucc", 5);
return true;
} else {
setLastError(qMakeError(d->access, tr("Error opening database"),
QSqlError::ConnectionError));
setOpenError(true);
return false;
}
}
5 編譯 ?:\Qt\4.4.3\src\plugins\sqldrivers\sqlite 下的工程, 在目錄 ?:\Qt\4.4.3\plugins\sqldrivers 中生成添加加密功能的sqlite
相應庫文件.
摘自:http://apps.hi.baidu.com/share/detail/21604459
可當我編譯到最后一步的時候,出現了‘sqlite3_key’ was not declared in this scope 的錯誤信息,我死活不知道為啥,只出現這個錯誤,sqlite3.h文件也已經進行了引入,可為啥還是出錯呢?今天靜下心來,閱讀sqlite3.h文件的sqlite3_key函數,發現在它的上面有一句
#ifdef SQLITE_HAS_CODEC
我突然若有所思,這句話的意思不就是如果定義了SQLITE_HAS_CODEC才可以使用sqlite3_key函數嘛。既然這樣,我們只要在提出錯誤的文件中進行定義即可。這樣我將出現找不到sqlite3_key函數的qsql_sqlite.cpp文件頭部加上:
#if defined SQLITE_HAS_CODEC
在文件的末尾加上:
#endif
重新進行編譯,編譯通過。
看來遇到問題,還是要就下心來。慢慢的,細心的分析,相信問題總能解決的。