




已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄Qt4訪問sqlite數(shù)據(jù)庫(kù)1RedHat 9 Linux下在QT3.1中連接SQLite3全過程詳細(xì)記錄5基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)15關(guān)于在qt中如何連接sqlite3數(shù)據(jù)庫(kù)的問題21SQLite 完整中文FAQ31C/C+中調(diào)用SQLITE3的基本步驟39SQLite嵌入式數(shù)據(jù)庫(kù)系統(tǒng)的研究與實(shí)現(xiàn)48Qt4訪問sqlite數(shù)據(jù)庫(kù)/index.php/2008/09/qt-sqlite/sqlite簡(jiǎn)介sqlite 是一款輕量級(jí)的、基于文件的嵌入式數(shù)據(jù)庫(kù),2000年就已經(jīng)誕生,經(jīng)過7年多的發(fā)展,直到今天已經(jīng)成為最流行的嵌入式數(shù)據(jù)庫(kù),包括google在內(nèi)的公司在其桌面軟件中亦使用 sqlite 存儲(chǔ)用戶數(shù)據(jù)。由此可以看出,已經(jīng)沒有任何理由去懷疑sqlite的穩(wěn)定性了。sqlite的優(yōu)勢(shì)1. 免配置,和access一樣,只要把數(shù)據(jù)庫(kù)文件通過ftp上傳到服務(wù)器上就可以使用,不需要服務(wù)器的額外支持2. 備份方便,因?yàn)橹皇且粋€(gè)文件,只要復(fù)制一份該文件,就能備份整個(gè)數(shù)據(jù)庫(kù)3. 雖然是輕量級(jí)數(shù)據(jù)庫(kù),但他支持最大 2tb 的單個(gè)庫(kù)文件。4. 快,無與倫比的快。經(jīng)過實(shí)際測(cè)試,在幾百萬記錄的情況下,sqlite的插入和查詢速度和 mysql 不分上下,快于 sql server,10倍于 access (但這并不意味著它可以替代 sql server )用QT操作sqlite由于sqlite屬于輕量級(jí)的數(shù)據(jù)庫(kù),不需要配置,不需要安裝,也不需要管理員,所以也就沒必要像操作mysql等數(shù)據(jù)庫(kù)一樣的設(shè)置主機(jī),用戶和密碼了。樣例如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include #include #include #include #include #include #include #include #include int main(int argc, char *argv) QApplication app(argc, argv); QTextEdit display; display.resize(400, 160); display.show(); /下面進(jìn)行數(shù)據(jù)庫(kù)的設(shè)置 QSqlDatabase db = QSqlDatabase:addDatabase(QSQLITE); /使用sqlite數(shù)據(jù)庫(kù)驅(qū)動(dòng) db.setDatabaseName(test); /我們之前建立的數(shù)據(jù)庫(kù) bool ok = db.open(); /嘗試連接數(shù)據(jù)庫(kù) if (ok) /這里用text已經(jīng)成功連上數(shù)據(jù)庫(kù) QSqlQuery query; /新建一個(gè)查詢的實(shí)例 if (query.exec(select * from student) /嘗試列出 student 表的所有記錄 /本次查詢成功 int numRows = 0; /詢問數(shù)據(jù)庫(kù)驅(qū)動(dòng),是否驅(qū)動(dòng)含有某種特性 if (db.driver()-hasFeature(QSqlDriver:QuerySize) numRows = query.size(); /如果支持結(jié)果影響的行數(shù),那么直接記錄下來 else query.last(); /否則定位到結(jié)果最后,qt 文檔說,這個(gè)方法非常慢 numRows = query.at() + 1; query.seek(-1); QString name, age; display.append(=); while(query.next() /定位結(jié)果到下一條記錄 name = query.value(0).toString(); age = query.value(1).toString(); QString result = name + + age; display.append(result); display.append(=); display.append(QString(totally %1 rows).arg(numRows) ); else /如果查詢失敗,用下面的方法得到具體數(shù)據(jù)庫(kù)返回的原因 QSqlError error = query.lastError(); display.append(From mysql database: + error.databaseText(); else /打開數(shù)據(jù)庫(kù)失敗,顯示數(shù)據(jù)庫(kù)返回的失敗描述 display.append(cannot open database.); display.append(Reason: + db.lastError().databaseText(); QApplication:connect(&app, SIGNAL(lastWindowClose(), &app, SLOT(quit(); return app.exec();RedHat 9 Linux下在QT3.1中連接SQLite3全過程詳細(xì)記錄/u/16292/showart_223940.html作者:zieckey()All Rights Reserved下文介紹的內(nèi)容都是基于 Linux RedHat 9.0 平臺(tái)的。1. 說明這里我們假設(shè)你已經(jīng)編譯好了sqlite的庫(kù)文件 :libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig和可執(zhí)行文件 : sqlite3我們?cè)偌僭O(shè)你的sqlite3的安裝目錄在 /usr/local/sqlite3 目錄下。如果不是,我們可以這樣做,將你的安裝文件復(fù)制到 /usr/local/sqlite3 這個(gè)目錄,這樣我們好在下面的操作中更加統(tǒng)一,從而減少出錯(cuò)的概率例如:rootlocalhost home# cp -rf sqlite-3.3.8-ix86/ /usr/local/sqlite3這里假設(shè) /usr/local/sqlite3/ 是你的安裝目錄,也就是說你的sqlite原來就是安裝在這里這樣之后,我們的sqlite3的庫(kù)文件目錄是:/usr/local/sqlite3/lib可執(zhí)行文件 sqlite3 的目錄是: /usr/local/sqlite3/bin頭文件 sqlite3.h 的目錄是: /usr/local/sqlite3/include可以用ls命令查看下:rootlocalhost sqlite# ls /usr/local/sqlite3/liblibsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig二、使用QT3連接SQLiterootlocalhost zieckey# mkdir test-qt3-sqlite3rootlocalhost zieckey# cd test-qt3-sqlite3/打開Designerrootlocalhost test-qt3-sqlite3# designer&4 8357新建一個(gè)C+ Project新建一個(gè) Dialog在該dialog上放置一個(gè) PushButton 和一個(gè) LineEdit并設(shè)置相應(yīng)的屬性保存到 test-qt3-sqlite3 目錄下新建一個(gè) C+ Main-file (main.cpp )再保存然后生成 *.h,*.cpp文件rootlocalhost test-qt3-sqlite3# uic -o mainform.h mainform.ui rootlocalhost test-qt3-sqlite3# uic -i mainform.h -o mainform.cpp mainform.ui注:這里的 mainform.ui 是你的 Dialog 的保存文件名字。修改 *.pro文件,如下:SOURCES += main.cpp mainform.cppHEADERS += mainform.hunix UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .objTEMPLATE =appCONFIG += qt warn_on releaseLANGUAGE = C+SQLITE_PATH=/usr/local/sqlite3DEPENDPATH += $SQLITE_PATH/includeINCLUDEPATH += $SQLITE_PATH/includeLIBS += -L$SQLITE_PATH/libLIBS += -lsqlite3TARGET = test-sqlite.out編輯 mainform.h/* Form interface generated from reading ui file mainform.ui* Created: 日 11月 5 16:24:45 2006* by: The User Interface Compiler ($Id: qt/main.cpp 3.1.1 edited Nov 21 17:40 $)* WARNING! All changes made in this file will be lost!*/#ifndef MAINFORM_H#define MAINFORM_H#include #include #include sqlite3.h /注意,這里一定要添加進(jìn)來class QVBoxLayout;class QHBoxLayout;class QGridLayout;class QLineEdit;class QPushButton;class MainForm : public QDialog Q_OBJECTpublic: MainForm( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); MainForm(); QLineEdit* showMsgLineEdit; QPushButton* openButton;public slots: virtual void openDBSlot(); /注意,這里是新建的一個(gè)SLOTprotected:protected slots: virtual void languageChange();#endif / MAINFORM_H編輯 mainform.cpp/* Form implementation generated from reading ui file mainform.ui* Created: 日 11月 5 16:25:05 2006* by: The User Interface Compiler ($Id: qt/main.cpp 3.1.1 edited Nov 21 17:40 $)* WARNING! All changes made in this file will be lost!*/#include mainform.h#include #include #include #include #include #include #include #include /* * Constructs a MainForm as a child of parent, with the * name name and widget flags set to f. * * The dialog will by default be modeless, unless you set modal to * TRUE to construct a modal dialog. */MainForm:MainForm( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) if ( !name ) setName( MainForm ); showMsgLineEdit = new QLineEdit( this, showMsgLineEdit ); showMsgLineEdit-setGeometry( QRect( 150, 230, 350, 21 ) ); openButton = new QPushButton( this, openButton ); openButton-setGeometry( QRect( 150, 70, 91, 30 ) ); languageChange(); resize( QSize(600, 480).expandedTo(minimumSizeHint() ); / signals and slots connections connect( openButton, SIGNAL( clicked() ), this, SLOT( openDBSlot() ) );/* * Destroys the object and frees any allocated resources */MainForm:MainForm() / no need to delete child widgets, Qt does it all for us/* * Sets the strings of the subwidgets using the current * language. */void MainForm:languageChange() setCaption( tr( A test Showing how to connect SQLite3 in QT3 ) ); openButton-setText( tr( Open DB ) );void MainForm:openDBSlot() /qWarning( MainForm:openDBSlot(): Not implemented yet ); /這里是數(shù)據(jù)庫(kù)的訪問 sqlite3 *db=NULL; int rc; rc = sqlite3_open(zieckey.db, &db); /打開指定的數(shù)據(jù)庫(kù)文件,如果不存在將創(chuàng)建一個(gè)同名的數(shù)據(jù)庫(kù)文件 if( rc ) QString errMsgQString; errMsgQString.sprintf(Cant open database: %sn, sqlite3_errmsg(db) ); showMsgLineEdit-setText(errMsgQString); sqlite3_close(db); else showMsgLineEdit-setText( open zieckey.db successfully!n ); sqlite3_close(db); /關(guān)閉數(shù)據(jù)庫(kù)main.cpp如下,它不用做任何更改,如果我們是按照上面說的那樣生成main.cpp的話#include #include mainform.hint main( int argc, char * argv ) QApplication a( argc, argv ); MainForm w; w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec();這一切做好了后,我們就可以開始編譯了.這里說明一下,在這之后,我們關(guān)心的只有四個(gè)文件:main.cpp mainform.h mainform.cpp *.prorootlocalhost test-qt3-sqlite3# qmakerootlocalhost test-qt3-sqlite3# make中間也許會(huì)有很多警告信息,這個(gè)不是太大問題,如果沒有錯(cuò)誤,那么我們可以運(yùn)行了:rootlocalhost test-qt3-sqlite3# ./test-sqlite.out也許會(huì)出現(xiàn)下面這樣的錯(cuò)誤:rootlocalhost test-qt3-sqlite3# ./test-sqlite.out./test-sqlite.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared objectfile: No such file or directory這個(gè)好辦:rootlocalhost qt3-sqlite3# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/sqlite3/librootlocalhost qt3-sqlite3# ./test-sqlite.out這樣就好了。看到運(yùn)行的效果了沒?點(diǎn)擊一下界面上的按鈕,看看有什么反應(yīng)?應(yīng)該是這樣的:那個(gè)標(biāo)簽條上顯示: open zieckey.db successfully!說明:實(shí)際應(yīng)用的時(shí)候,在qt3下根本就不需要顯示的調(diào)用 uic 生成 .h .cpp 文件,這里是方便行文才這樣做的??偨Y(jié):這里我們知道了QT Designer 的基本用法、QT編程的基本實(shí)現(xiàn);最重要的是我們知道了怎么在qt下連接sqlite。本文純粹是交流之作,僅作拋磚引玉之用。歡迎交流。基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)/h/149/4091.html摘要 首先,分析Linux下的常見數(shù)據(jù)庫(kù)技術(shù)。然后,指出嵌入式系統(tǒng)開發(fā)中對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn),論述SQLite嵌入式數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)和開發(fā)技術(shù)。最后,結(jié)合ARM Linux開發(fā)平臺(tái),講述具體的實(shí)現(xiàn)方法。關(guān)鍵詞 嵌入式數(shù)據(jù)庫(kù) SQLite ARM Linux引言隨著嵌入式系統(tǒng)的廣泛應(yīng)用和用戶對(duì)數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備和數(shù)據(jù)庫(kù)技術(shù)的緊密結(jié)合已經(jīng)得到了各方面的重視。不久的將來嵌入式數(shù)據(jù)庫(kù)將無處不在。縱觀目前國(guó)際、國(guó)內(nèi)嵌入式數(shù)據(jù)庫(kù)的應(yīng)用情況,目前基于嵌入式數(shù)據(jù)庫(kù)應(yīng)用的市場(chǎng)已經(jīng)進(jìn)入加速發(fā)展的階段。1Linux 下常見的數(shù)據(jù)庫(kù)技術(shù)分析基于Linux平臺(tái)的數(shù)據(jù)庫(kù)非常多,大型的商用數(shù)據(jù)庫(kù)有Oracle、Sybase、Informix、Informix、IBM DB2等;中小型的更是不勝枚舉,以下是常見的幾種。(1) PostgreSQLPostgreSQL 是世界上最優(yōu)秀的開放源碼的數(shù)據(jù)庫(kù)之一,是完全免費(fèi)的數(shù)據(jù)庫(kù),不需要任何版權(quán)費(fèi)用和購(gòu)買費(fèi)。因此,它是許多Linux發(fā)行版本的首選,例如: Redhat、TurboLinux都預(yù)裝了PostgreSQL。 PostgreSQL兼容性很強(qiáng),如果是SQL92兼容的,移植PostgreSQL非常簡(jiǎn)單和快捷。(2) MySQLMySQL是多 用戶、多進(jìn)程的SQL database server。MySQL包括一個(gè)server daemon(mysqld)和client programs與libraries的client/server實(shí)現(xiàn)工具;比較適合小而簡(jiǎn)單的數(shù)據(jù)庫(kù),對(duì)復(fù)雜的操作要求支持不是很好。MySQL的 licensing policy:如果你是普通的最終用戶,使用MySQL不需要付錢;但如果是直接或間接地出售MySQL的服務(wù)程序或相關(guān)產(chǎn)品,或是在一些客戶端維護(hù) MySQL server并收取費(fèi)用,或是在發(fā)行版中包括MySQL,就需要獲得許可。* 本課題是2003年河南省杰出人才創(chuàng)新基金項(xiàng)目(0321000300),獲得了河南省科技廳的資金支持。(3) mSQL(mini SQL)mSQL是一個(gè)單用戶數(shù)據(jù)庫(kù)管理系統(tǒng)。由于它的短小精悍,使其開發(fā)的應(yīng)用系統(tǒng)特別受到互聯(lián)網(wǎng)用戶青 睞。mSQL并非是完全的freeware,若是在大學(xué)中使用此一軟件,或是為了學(xué)術(shù)研究與慈善等非營(yíng)利性目的,才能免費(fèi)得到使用權(quán)(free license),否則就得付費(fèi)注冊(cè)才能得到正式的版權(quán)。(4) Berkeley DBBerkeley DB是一個(gè)開放源代碼的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),能夠?yàn)閼?yīng)用程序提供高性能的數(shù)據(jù)管理服務(wù)。應(yīng)用它,程序員只需要調(diào)用一些簡(jiǎn)單的API就可以完成對(duì)數(shù)據(jù)的訪 問和管理。與常用的數(shù)據(jù)庫(kù)管理系統(tǒng)(如MySQL和Oracle等)有所不同,在Berkeley DB中并沒有數(shù)據(jù)庫(kù)服務(wù)器的概念。應(yīng)用程序不需要事先同數(shù)據(jù)庫(kù)服務(wù)建立起網(wǎng)絡(luò)連接,而是通過內(nèi)嵌在程序中的Berkeley DB函數(shù)庫(kù)來完成對(duì)數(shù)據(jù)的保存、查詢、修改和刪除等操作。(5) SQLiteSQLite支持絕大多數(shù)標(biāo)準(zhǔn)的SQL92語(yǔ)句,采用單文 件存放數(shù)據(jù)庫(kù),速度又比 MySQL快上12倍(官方的數(shù)據(jù)),存儲(chǔ)量也不是問題。在操作語(yǔ)句上更類似關(guān)系型數(shù)據(jù)庫(kù)的產(chǎn)品使用,非常方便。SQLite的版權(quán)允許無任何限制的應(yīng) 用,包括商業(yè)性的產(chǎn)品。在PHP5中已經(jīng)集成了這個(gè)輕巧的嵌入式數(shù)據(jù)庫(kù)產(chǎn)品。2嵌入式開發(fā)對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)在眾多的數(shù)據(jù)庫(kù)中,如何選擇適用于嵌入式系統(tǒng)的數(shù)據(jù)庫(kù)呢?嵌入式系統(tǒng)開發(fā)環(huán)境決定了其對(duì)數(shù)據(jù)庫(kù)需求的特點(diǎn)。(1) 適當(dāng)?shù)捏w積嵌入式系統(tǒng)對(duì)于數(shù)據(jù)的存儲(chǔ)與程序的運(yùn)行一般都有較強(qiáng)的空間限制,所以適用于嵌入式系統(tǒng)使用的數(shù)據(jù)庫(kù)首先應(yīng)該有一個(gè)適當(dāng)?shù)捏w積。(2) 較強(qiáng)的功能嵌入式開發(fā)中有很多應(yīng)用,用戶需求決定了開發(fā)中需要有一個(gè)大小適中且功能齊備的數(shù)據(jù)庫(kù)來實(shí)現(xiàn)對(duì)數(shù)據(jù)的管理。對(duì)開發(fā)人員來說,要求采用的數(shù)據(jù)庫(kù)技術(shù)提供完備開發(fā)的文檔而且易于開發(fā)。(3) 開源的代碼作為產(chǎn)品的開發(fā),開源的代碼不僅可以減少產(chǎn)品的生產(chǎn)成本,更重要的是為產(chǎn)品的維護(hù)完善和穩(wěn)定運(yùn)行都提供了最為徹底的解決手段。上 面介紹的數(shù)據(jù)庫(kù)技術(shù)中,Oracle、Sybase、Informix、IBM DB2等功能強(qiáng)大,系統(tǒng)體積龐大,要求付費(fèi)使用,僅適用于作為大型商業(yè)數(shù)據(jù)庫(kù)。MySQL在保持中等體積的情況下,提供了較為適用的功能已經(jīng)成為中小規(guī)模 數(shù)據(jù)庫(kù)應(yīng)用的首選,但商業(yè)應(yīng)用也要收費(fèi),而且對(duì)于嵌入式開發(fā)來說空間占用仍然太大,目前還不適用。mSQL是一種簡(jiǎn)化的SQL數(shù)據(jù)庫(kù),短小精悍,開發(fā)方便,適用于嵌入式開發(fā);但mSQL只有30天的使用期限,并非完全的開源。余下的開放源碼數(shù)據(jù)庫(kù)中,PostgreSQL是Linux下最完善的開源SQL數(shù)據(jù)庫(kù),但體積也較大。Berkeley DB作為完全開源的嵌入式數(shù)據(jù)庫(kù)速度極快,可靠性高;但學(xué)習(xí)起來有一定難度,必然會(huì)加大開發(fā)成本。SQLite 則簡(jiǎn)單易用,速度也很快,同時(shí)提供了豐富的數(shù)據(jù)庫(kù)接口,功能雖較Berkeley DB略有遜色,但在開源社區(qū)的推動(dòng)下差距正在縮小。它的設(shè)計(jì)思想是小型、快速和最小化的管理。這對(duì)于需要一個(gè)數(shù)據(jù)庫(kù)用于存儲(chǔ)數(shù)據(jù),但又不想花太多時(shí)間來調(diào) 整數(shù)據(jù)性能的開發(fā)人員很適用。實(shí)際上在很多情況下,并不需要存儲(chǔ)程序或復(fù)雜的表之間的關(guān)聯(lián)。這時(shí)會(huì)發(fā)現(xiàn)SQLite在大小和功能之間找到了一個(gè)理想的平衡 點(diǎn)。完全的開源代碼使其可以稱得上是理想的“嵌入式數(shù)據(jù)庫(kù)”。3SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)SQLite是D理查德希普開發(fā)出來的用一個(gè)小型C庫(kù)實(shí)現(xiàn)的一種強(qiáng)有力的嵌入式關(guān)系數(shù)據(jù)庫(kù)管理體制。它提供了對(duì)SQL92的大多數(shù)支持:支持多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動(dòng)。這個(gè)庫(kù)有很強(qiáng)的內(nèi)聚性,通過不到25 000行的ANSI C代碼實(shí)現(xiàn),而且可以自由地應(yīng)用于任何目的甚至包括商業(yè)應(yīng)用。此外它還是高速、有效和可升級(jí)的,可以運(yùn)行于從ARM/ Linux到SPARC / Solaris的多種硬件平臺(tái)。3.1體系結(jié)構(gòu)圖1SQLite體系結(jié)構(gòu)SQLite 有一種優(yōu)雅、 標(biāo)準(zhǔn)化的設(shè)計(jì)。它可以分成8個(gè)主要子系統(tǒng),如圖1所示,其中有一些相當(dāng)接近于關(guān)系數(shù)據(jù)庫(kù)管理。在圖1的頂層是標(biāo)記處理器(tokenizer)和分析器(parser)。SQLite有自己高度優(yōu)化的分析生成器(檸檬分析器),可以快速地生產(chǎn)出高效率的代碼,而且依靠它新穎的設(shè)計(jì)對(duì)內(nèi)存泄漏有著特別的抵抗力。在底部是基于Knuth經(jīng)過優(yōu)化的B樹。這樣可以運(yùn)行在可調(diào)整的頁(yè)面緩沖(page cache)上,有助于將對(duì)磁盤的查找減到最小。再往下是頁(yè)面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數(shù)據(jù)庫(kù)的移動(dòng)。體 系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫(kù)引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶和儲(chǔ)存之間信息進(jìn)行交換的中間單元。從各個(gè)方面來看,它都是 SQLite的核心。在SQL語(yǔ)句被分析之后,VDBE開始起作用。代碼生成器將分析樹翻譯成一個(gè)袖珍程序,隨后這些袖珍程序又被組合成用VDBE的虛擬 機(jī)器語(yǔ)言表示的一系列指令。如此往復(fù),VDBE執(zhí)行每條指令,最終完成SQL語(yǔ)句指定的查詢要求。VDBE 的機(jī)器語(yǔ)言由圍繞于數(shù)據(jù)庫(kù)管理 128 個(gè)操作碼(opcode)組成。對(duì)于打開表,查詢索引、存儲(chǔ)和刪除記錄和很多其他數(shù)據(jù)庫(kù)操作都有對(duì)應(yīng)的操作碼。在VDBE里的每條指令由1個(gè)操作碼和3個(gè) 操作數(shù)(operand)組成。一些指令使用全部(3個(gè))操作數(shù);也有些可能一個(gè)也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開一個(gè)表的 指針,使用了全部(3個(gè))操作數(shù):第1個(gè)操作數(shù)(P1)包含指針的ID號(hào)。第2操作數(shù)(P2)指出表的根位置(或者表的首頁(yè)位置);而第3個(gè)操作數(shù)則是表 的名字。對(duì)于Rollback指令則根本不需要操作數(shù)。為了進(jìn)行一次Rollback VDBE,僅需知道是否要做Rollback1。3.2SQLite開發(fā)技術(shù)SQLite 的API極其易于使用,只需要三個(gè)用來執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴(kuò)展的,允許程序員自定義函數(shù)然后以callback的形式集合進(jìn)去。C語(yǔ) 言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開放源碼團(tuán)體已經(jīng)擴(kuò)展了眾多的客戶接口、適配器、驅(qū)動(dòng)等,這就使得其他語(yǔ)言對(duì)SQLite的使用 也成為可能。使用C語(yǔ)言API只需要三步。首先,要提供文件名和訪問模式用來調(diào)用sqlite _open()連接數(shù)據(jù)庫(kù)。然后,執(zhí)行一個(gè)callback函數(shù),SQLite通過對(duì)每個(gè)記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫(kù)那里得到的結(jié)果。最 后,如果想執(zhí)行一個(gè)SQL查詢并獲得一個(gè)callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯(cuò)誤代碼檢查。SQLite可 以通過對(duì)一個(gè)主鍵聲明它為INTEGER PRIMARY KEY成為能夠自動(dòng)增加的主鍵,實(shí)現(xiàn)自增字段。SQLite還提供了存取二進(jìn)制大對(duì)象(BLOBs)的方法,在線程安全、數(shù)據(jù)庫(kù)管理、API的擴(kuò)展等方面也都提供了強(qiáng)大方便的技術(shù)支持。4SQLite在ARMLinux平臺(tái)上的實(shí)現(xiàn)SQLite嵌入式數(shù)據(jù)庫(kù)提供了以源碼發(fā)布的方式,要在眾多的硬件平臺(tái)進(jìn)行移植,可以根據(jù)不同平臺(tái)對(duì)源碼進(jìn)行交叉編譯來實(shí)現(xiàn)。編譯主要有以下幾個(gè)步驟2: 到/的cvs中下載最新的源代碼包,解壓后將生成sqlite目錄,另外新建并轉(zhuǎn)到一個(gè)與sqlite目錄平行的同級(jí)目錄,如make目錄。 用“echo $PATH”命令查看PATH中是否已經(jīng)包含交叉編譯工具armlinuxgcc。 為了在ARMLinux下能正常運(yùn)行sqlite,需要對(duì)sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹)有正確的 變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會(huì)有些差別。對(duì)于ARMLinux可以找到如下部分:# ifndef INTPTR_TYPE# if SQLITE_PTR_SZ=4# define INTPTR_TYPE int# else# define INTPTR_TYPE long long# endif 在上面的代碼前加上一句#define SQLITE_PTR_SZ 4 這樣后面的“typedef INTPTR_TYPE ptr;”就是定義的“int”類型,而不是“l(fā)ong long”。 使用configure進(jìn)行一些配置。修改sqlite目錄下的configure,讓configure不去檢查交叉編譯環(huán)境。由于篇幅有限不再詳述。 修改Makefile文件。將代碼行 BCC = armlinuxgccgO2改成BCC = gccgO2。另外,一般是以靜態(tài)鏈接的形式將sqlite放到ARMLinux的硬件板上運(yùn)行的,所以繼續(xù)修改Makefile,找到標(biāo)記為 sqlite:的代碼段,將其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、 libsqlite.a、libsqlite.so。為了減小執(zhí)行文件大小可以用strip處理,去掉其中的調(diào)試信息。 在ARM板上運(yùn)行sqlite。將sqlite拷貝到ARM板上,方法很多,需要根據(jù)具體的情況來選擇。如ftp、cmdftp、wget等。將sqlite下載到ARM板的/tmp目錄,因?yàn)榇四夸浭强蓪懙?。修改?quán)限并運(yùn)行:chmod wx sqlite./sqlite test.sqlite 會(huì)出現(xiàn)sqlite 如果一切正常,現(xiàn)在sqlite已經(jīng)在ARMLinux下跑了起來,然后就可以基于此進(jìn)行進(jìn)一步的應(yīng)用開發(fā)了。5SQLite的應(yīng)用開發(fā)家 庭網(wǎng)絡(luò)中央控制器以ARM微處理器為中心建立硬件平臺(tái),對(duì)外通過寬帶Ethernet、Modem與Internet連接,對(duì)內(nèi)將家用電器通過內(nèi)部無線局 域網(wǎng)連接成一體,通過遠(yuǎn)程Web瀏覽器、本地觸摸屏以及電話語(yǔ)音三種方式實(shí)現(xiàn)對(duì)家用電器的狀態(tài)查詢和控制。多樣化的數(shù)據(jù)存儲(chǔ)與管理需要有一個(gè)后臺(tái)數(shù)據(jù)庫(kù)來 支撐,SQLite無疑是一個(gè)合適的選擇。下面就其應(yīng)用程序的編寫方式作一個(gè)簡(jiǎn)單的介紹。為了講解方便,下面例程通過程序代碼生成了數(shù)據(jù)庫(kù)sysdb及其中的一個(gè)表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫(kù)。#include #include sqlite.hint callback( void *p_data, int num_fields, char *p_fields,char *p_col_names);main()FILE *inp_fp;int ret;int nrecs = 0;char *errmsg;sqlite *p_db;unsigned char *sqlcommand;unsigned char * sqlcreatedb;sqlcommand=select * from user ; ;sqlcreatedb=create table user(id numeric, name text);/*建立數(shù)據(jù)庫(kù)*/if (inp_fp = fopen(./sysdb, r)=NULL) printf(Cannot find database file !n);printf(Recover the database file .n);p_db=sqlite_open(./sysdb,0777,0);sqlite_exec(p_db,sqlcreatedb,0,0,0);printf(The database file have been recorvered!n);sqlite_close(p_db);/*打開數(shù)據(jù)庫(kù)*/sqlite* p_db=sqlite_open(./sysdb, 0777, 0);/*選擇 user表中的所有記錄. */ret=sqlite_exec(p_db,sqlcommand,callback, &nrecs,errmsg);if(ret!=SQLITE_OK)printf(Error on SELECT: %s.n, errmsg);elseprintf(Retrieved %i records.n, nrecs);/* 關(guān)閉數(shù)據(jù)庫(kù)*/sqlite_close(p_db);int callback( void *p_data, int num_fields, char*p_fields,char *p_col_names)int i;int *p_rn = (int*)p_data;(*p_rn) ;for(i=0; i num_fields; i )printf(%s p_fieldsi);return 0;然后利用sqlite.h、libsqlite.a、libsqlite.so,根據(jù)需要進(jìn)行交叉編譯即可。上 例僅是一個(gè)簡(jiǎn)單的程序段,可以根據(jù)需要構(gòu)造自己的數(shù)據(jù)庫(kù)和callback函數(shù),用來實(shí)現(xiàn)具體的功能。支持SQLite的第三方極多,在項(xiàng)目實(shí)際開發(fā)中還 針對(duì)QT利用qtsqliteplugin插件開發(fā)了圖形程序,用以實(shí)現(xiàn)通過觸摸屏的本地交互界面,利用移植的Web服務(wù)器編寫了CGI程序,實(shí)現(xiàn)了 B/S模式的遠(yuǎn)程訪問。6總結(jié)在經(jīng)過大量的分析對(duì)比之后,針對(duì)嵌入式系統(tǒng)開發(fā)的特點(diǎn),從眾多數(shù)據(jù)庫(kù)發(fā)行版中選出非常適用的嵌入式數(shù)據(jù)庫(kù) SQLite。在ARMLinux下完成了對(duì)SQLite的編譯,并基于此在項(xiàng)目中作了進(jìn)一步的開發(fā)工作。實(shí)踐證明,SQLite能夠出色地完成嵌入式 系統(tǒng)中的數(shù)據(jù)庫(kù)應(yīng)用需求。參考文獻(xiàn)1Michael Owens. Embedding an SQL Database with SQLite. Linux Journal, 200306012How To Compile. /3薛啟康. Linux環(huán)境下的數(shù)據(jù)庫(kù). 中國(guó)計(jì)算機(jī)報(bào), 2001總期號(hào):1009 關(guān)于在qt中如何連接sqlite3數(shù)據(jù)庫(kù)的問題/u/16292/showart_136086.html因?yàn)槲覝?zhǔn)備寫一篇很詳細(xì)的有關(guān)這方面的文章,只可惜一直沒有時(shí)間。但是最近看到很多朋友問這個(gè)問題,這里我就簡(jiǎn)單的介紹下。這個(gè)是個(gè)測(cè)試數(shù)據(jù)庫(kù)sqlite3以及其C+組件sqlitedataset如何在qt下工作的程序。主要的數(shù)據(jù)庫(kù)所需數(shù)據(jù)。CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);INSERT INTO SensorData VALUES(NULL, 1, 0, 200605011206, 18.9);INSERT INTO SensorData VALUES(2, 1, 0, 200605011306, 16.4);INSERT INTO SensorData VALUES(3, 1, 0, 200605011406, 15.3);INSERT INTO SensorData VALUES(4, 1, 0, 200605011506, 15.5);INSERT INTO SensorData VALUES(5, 1, 0, 200605011606, 15.8);INSERT INTO SensorData VALUES(6, 1, 0, 200605011706, 12.5);INSERT INTO SensorData VALUES(7, 1, 0, 200605011806, 5.8);INSERT INTO SensorData VALUES(8, 1, 0, 200605011906, 5.5);INSERT INTO SensorData VALUES(9, 0, 0, 200605011206, 0.8);INSERT INTO SensorData VALUES(10, 0, 0, 200605011206, 0.8);INSERT INTO SensorData VALUES(11, 0, 0, 200605011206, 0.8);INSERT INTO SensorData VALUES(12, 0, 0, 200605011206,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城鎮(zhèn)污水管網(wǎng)建設(shè)項(xiàng)目安全管理方案(參考模板)
- xx河流排水防澇設(shè)施建設(shè)項(xiàng)目數(shù)字化方案(范文)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)項(xiàng)目申請(qǐng)報(bào)告(模板范文)
- 鄉(xiāng)村振興戰(zhàn)略下能源電力行業(yè)面臨的挑戰(zhàn)及對(duì)策
- 物流與供應(yīng)鏈管理教案
- 五年級(jí)學(xué)期學(xué)習(xí)計(jì)劃(34篇)
- 2025年光學(xué)纖維面板系列項(xiàng)目發(fā)展計(jì)劃
- 五年級(jí)科學(xué)上冊(cè)教案 - 5《身體的“聯(lián)絡(luò)員”》 教科版
- 中暑現(xiàn)場(chǎng)應(yīng)急處置方案
- 2025年大流量羅茨鼓風(fēng)機(jī)項(xiàng)目發(fā)展計(jì)劃
- 宿舍清潔服務(wù)方案(3篇)
- 校園清廉建設(shè)活動(dòng)方案
- 總經(jīng)理半年度總結(jié)述職報(bào)告
- 精神科護(hù)理進(jìn)修總結(jié)
- 維克多高中英語(yǔ)3500詞匯
- (約克)機(jī)組熱回收技術(shù)
- (完整版)常見腫瘤AJCC分期手冊(cè)第八版(中文版)
- 托瑪琳養(yǎng)生碗gg課件
- 水產(chǎn)養(yǎng)殖示范基地建設(shè)項(xiàng)目實(shí)施方案
- 行政后勤人員 三級(jí)安全教育培訓(xùn)記錄卡
- DB52∕T 1480-2019 GLW-8430連棟塑料薄膜溫室通用技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論