Qt4訪問sqlite數(shù)據(jù)庫.doc_第1頁
Qt4訪問sqlite數(shù)據(jù)庫.doc_第2頁
Qt4訪問sqlite數(shù)據(jù)庫.doc_第3頁
Qt4訪問sqlite數(shù)據(jù)庫.doc_第4頁
Qt4訪問sqlite數(shù)據(jù)庫.doc_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

目錄Qt4訪問sqlite數(shù)據(jù)庫1RedHat 9 Linux下在QT3.1中連接SQLite3全過程詳細(xì)記錄5基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)15關(guān)于在qt中如何連接sqlite3數(shù)據(jù)庫的問題21SQLite 完整中文FAQ31C/C+中調(diào)用SQLITE3的基本步驟39SQLite嵌入式數(shù)據(jù)庫系統(tǒng)的研究與實現(xiàn)48Qt4訪問sqlite數(shù)據(jù)庫/index.php/2008/09/qt-sqlite/sqlite簡介sqlite 是一款輕量級的、基于文件的嵌入式數(shù)據(jù)庫,2000年就已經(jīng)誕生,經(jīng)過7年多的發(fā)展,直到今天已經(jīng)成為最流行的嵌入式數(shù)據(jù)庫,包括google在內(nèi)的公司在其桌面軟件中亦使用 sqlite 存儲用戶數(shù)據(jù)。由此可以看出,已經(jīng)沒有任何理由去懷疑sqlite的穩(wěn)定性了。sqlite的優(yōu)勢1. 免配置,和access一樣,只要把數(shù)據(jù)庫文件通過ftp上傳到服務(wù)器上就可以使用,不需要服務(wù)器的額外支持2. 備份方便,因為只是一個文件,只要復(fù)制一份該文件,就能備份整個數(shù)據(jù)庫3. 雖然是輕量級數(shù)據(jù)庫,但他支持最大 2tb 的單個庫文件。4. 快,無與倫比的快。經(jīng)過實際測試,在幾百萬記錄的情況下,sqlite的插入和查詢速度和 mysql 不分上下,快于 sql server,10倍于 access (但這并不意味著它可以替代 sql server )用QT操作sqlite由于sqlite屬于輕量級的數(shù)據(jù)庫,不需要配置,不需要安裝,也不需要管理員,所以也就沒必要像操作mysql等數(shù)據(jù)庫一樣的設(shè)置主機,用戶和密碼了。樣例如下: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(); /下面進行數(shù)據(jù)庫的設(shè)置 QSqlDatabase db = QSqlDatabase:addDatabase(QSQLITE); /使用sqlite數(shù)據(jù)庫驅(qū)動 db.setDatabaseName(test); /我們之前建立的數(shù)據(jù)庫 bool ok = db.open(); /嘗試連接數(shù)據(jù)庫 if (ok) /這里用text已經(jīng)成功連上數(shù)據(jù)庫 QSqlQuery query; /新建一個查詢的實例 if (query.exec(select * from student) /嘗試列出 student 表的所有記錄 /本次查詢成功 int numRows = 0; /詢問數(shù)據(jù)庫驅(qū)動,是否驅(qū)動含有某種特性 if (db.driver()-hasFeature(QSqlDriver:QuerySize) numRows = query.size(); /如果支持結(jié)果影響的行數(shù),那么直接記錄下來 else query.last(); /否則定位到結(jié)果最后,qt 文檔說,這個方法非常慢 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ù)庫返回的原因 QSqlError error = query.lastError(); display.append(From mysql database: + error.databaseText(); else /打開數(shù)據(jù)庫失敗,顯示數(shù)據(jù)庫返回的失敗描述 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 平臺的。1. 說明這里我們假設(shè)你已經(jīng)編譯好了sqlite的庫文件 :libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig和可執(zhí)行文件 : sqlite3我們再假設(shè)你的sqlite3的安裝目錄在 /usr/local/sqlite3 目錄下。如果不是,我們可以這樣做,將你的安裝文件復(fù)制到 /usr/local/sqlite3 這個目錄,這樣我們好在下面的操作中更加統(tǒng)一,從而減少出錯的概率例如:rootlocalhost home# cp -rf sqlite-3.3.8-ix86/ /usr/local/sqlite3這里假設(shè) /usr/local/sqlite3/ 是你的安裝目錄,也就是說你的sqlite原來就是安裝在這里這樣之后,我們的sqlite3的庫文件目錄是:/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新建一個C+ Project新建一個 Dialog在該dialog上放置一個 PushButton 和一個 LineEdit并設(shè)置相應(yīng)的屬性保存到 test-qt3-sqlite3 目錄下新建一個 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 /注意,這里一定要添加進來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(); /注意,這里是新建的一個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ù)庫的訪問 sqlite3 *db=NULL; int rc; rc = sqlite3_open(zieckey.db, &db); /打開指定的數(shù)據(jù)庫文件,如果不存在將創(chuàng)建一個同名的數(shù)據(jù)庫文件 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ù)庫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)心的只有四個文件:main.cpp mainform.h mainform.cpp *.prorootlocalhost test-qt3-sqlite3# qmakerootlocalhost test-qt3-sqlite3# make中間也許會有很多警告信息,這個不是太大問題,如果沒有錯誤,那么我們可以運行了:rootlocalhost test-qt3-sqlite3# ./test-sqlite.out也許會出現(xiàn)下面這樣的錯誤: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這個好辦:rootlocalhost qt3-sqlite3# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/sqlite3/librootlocalhost qt3-sqlite3# ./test-sqlite.out這樣就好了。看到運行的效果了沒?點擊一下界面上的按鈕,看看有什么反應(yīng)?應(yīng)該是這樣的:那個標(biāo)簽條上顯示: open zieckey.db successfully!說明:實際應(yīng)用的時候,在qt3下根本就不需要顯示的調(diào)用 uic 生成 .h .cpp 文件,這里是方便行文才這樣做的??偨Y(jié):這里我們知道了QT Designer 的基本用法、QT編程的基本實現(xiàn);最重要的是我們知道了怎么在qt下連接sqlite。本文純粹是交流之作,僅作拋磚引玉之用。歡迎交流?;贏RM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)/h/149/4091.html摘要 首先,分析Linux下的常見數(shù)據(jù)庫技術(shù)。然后,指出嵌入式系統(tǒng)開發(fā)中對數(shù)據(jù)庫的需求特點,論述SQLite嵌入式數(shù)據(jù)庫的體系結(jié)構(gòu)和開發(fā)技術(shù)。最后,結(jié)合ARM Linux開發(fā)平臺,講述具體的實現(xiàn)方法。關(guān)鍵詞 嵌入式數(shù)據(jù)庫 SQLite ARM Linux引言隨著嵌入式系統(tǒng)的廣泛應(yīng)用和用戶對數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備和數(shù)據(jù)庫技術(shù)的緊密結(jié)合已經(jīng)得到了各方面的重視。不久的將來嵌入式數(shù)據(jù)庫將無處不在??v觀目前國際、國內(nèi)嵌入式數(shù)據(jù)庫的應(yīng)用情況,目前基于嵌入式數(shù)據(jù)庫應(yīng)用的市場已經(jīng)進入加速發(fā)展的階段。1Linux 下常見的數(shù)據(jù)庫技術(shù)分析基于Linux平臺的數(shù)據(jù)庫非常多,大型的商用數(shù)據(jù)庫有Oracle、Sybase、Informix、Informix、IBM DB2等;中小型的更是不勝枚舉,以下是常見的幾種。(1) PostgreSQLPostgreSQL 是世界上最優(yōu)秀的開放源碼的數(shù)據(jù)庫之一,是完全免費的數(shù)據(jù)庫,不需要任何版權(quán)費用和購買費。因此,它是許多Linux發(fā)行版本的首選,例如: Redhat、TurboLinux都預(yù)裝了PostgreSQL。 PostgreSQL兼容性很強,如果是SQL92兼容的,移植PostgreSQL非常簡單和快捷。(2) MySQLMySQL是多 用戶、多進程的SQL database server。MySQL包括一個server daemon(mysqld)和client programs與libraries的client/server實現(xiàn)工具;比較適合小而簡單的數(shù)據(jù)庫,對復(fù)雜的操作要求支持不是很好。MySQL的 licensing policy:如果你是普通的最終用戶,使用MySQL不需要付錢;但如果是直接或間接地出售MySQL的服務(wù)程序或相關(guān)產(chǎn)品,或是在一些客戶端維護 MySQL server并收取費用,或是在發(fā)行版中包括MySQL,就需要獲得許可。* 本課題是2003年河南省杰出人才創(chuàng)新基金項目(0321000300),獲得了河南省科技廳的資金支持。(3) mSQL(mini SQL)mSQL是一個單用戶數(shù)據(jù)庫管理系統(tǒng)。由于它的短小精悍,使其開發(fā)的應(yīng)用系統(tǒng)特別受到互聯(lián)網(wǎng)用戶青 睞。mSQL并非是完全的freeware,若是在大學(xué)中使用此一軟件,或是為了學(xué)術(shù)研究與慈善等非營利性目的,才能免費得到使用權(quán)(free license),否則就得付費注冊才能得到正式的版權(quán)。(4) Berkeley DBBerkeley DB是一個開放源代碼的嵌入式數(shù)據(jù)庫管理系統(tǒng),能夠為應(yīng)用程序提供高性能的數(shù)據(jù)管理服務(wù)。應(yīng)用它,程序員只需要調(diào)用一些簡單的API就可以完成對數(shù)據(jù)的訪 問和管理。與常用的數(shù)據(jù)庫管理系統(tǒng)(如MySQL和Oracle等)有所不同,在Berkeley DB中并沒有數(shù)據(jù)庫服務(wù)器的概念。應(yīng)用程序不需要事先同數(shù)據(jù)庫服務(wù)建立起網(wǎng)絡(luò)連接,而是通過內(nèi)嵌在程序中的Berkeley DB函數(shù)庫來完成對數(shù)據(jù)的保存、查詢、修改和刪除等操作。(5) SQLiteSQLite支持絕大多數(shù)標(biāo)準(zhǔn)的SQL92語句,采用單文 件存放數(shù)據(jù)庫,速度又比 MySQL快上12倍(官方的數(shù)據(jù)),存儲量也不是問題。在操作語句上更類似關(guān)系型數(shù)據(jù)庫的產(chǎn)品使用,非常方便。SQLite的版權(quán)允許無任何限制的應(yīng) 用,包括商業(yè)性的產(chǎn)品。在PHP5中已經(jīng)集成了這個輕巧的嵌入式數(shù)據(jù)庫產(chǎn)品。2嵌入式開發(fā)對數(shù)據(jù)庫的需求特點在眾多的數(shù)據(jù)庫中,如何選擇適用于嵌入式系統(tǒng)的數(shù)據(jù)庫呢?嵌入式系統(tǒng)開發(fā)環(huán)境決定了其對數(shù)據(jù)庫需求的特點。(1) 適當(dāng)?shù)捏w積嵌入式系統(tǒng)對于數(shù)據(jù)的存儲與程序的運行一般都有較強的空間限制,所以適用于嵌入式系統(tǒng)使用的數(shù)據(jù)庫首先應(yīng)該有一個適當(dāng)?shù)捏w積。(2) 較強的功能嵌入式開發(fā)中有很多應(yīng)用,用戶需求決定了開發(fā)中需要有一個大小適中且功能齊備的數(shù)據(jù)庫來實現(xiàn)對數(shù)據(jù)的管理。對開發(fā)人員來說,要求采用的數(shù)據(jù)庫技術(shù)提供完備開發(fā)的文檔而且易于開發(fā)。(3) 開源的代碼作為產(chǎn)品的開發(fā),開源的代碼不僅可以減少產(chǎn)品的生產(chǎn)成本,更重要的是為產(chǎn)品的維護完善和穩(wěn)定運行都提供了最為徹底的解決手段。上 面介紹的數(shù)據(jù)庫技術(shù)中,Oracle、Sybase、Informix、IBM DB2等功能強大,系統(tǒng)體積龐大,要求付費使用,僅適用于作為大型商業(yè)數(shù)據(jù)庫。MySQL在保持中等體積的情況下,提供了較為適用的功能已經(jīng)成為中小規(guī)模 數(shù)據(jù)庫應(yīng)用的首選,但商業(yè)應(yīng)用也要收費,而且對于嵌入式開發(fā)來說空間占用仍然太大,目前還不適用。mSQL是一種簡化的SQL數(shù)據(jù)庫,短小精悍,開發(fā)方便,適用于嵌入式開發(fā);但mSQL只有30天的使用期限,并非完全的開源。余下的開放源碼數(shù)據(jù)庫中,PostgreSQL是Linux下最完善的開源SQL數(shù)據(jù)庫,但體積也較大。Berkeley DB作為完全開源的嵌入式數(shù)據(jù)庫速度極快,可靠性高;但學(xué)習(xí)起來有一定難度,必然會加大開發(fā)成本。SQLite 則簡單易用,速度也很快,同時提供了豐富的數(shù)據(jù)庫接口,功能雖較Berkeley DB略有遜色,但在開源社區(qū)的推動下差距正在縮小。它的設(shè)計思想是小型、快速和最小化的管理。這對于需要一個數(shù)據(jù)庫用于存儲數(shù)據(jù),但又不想花太多時間來調(diào) 整數(shù)據(jù)性能的開發(fā)人員很適用。實際上在很多情況下,并不需要存儲程序或復(fù)雜的表之間的關(guān)聯(lián)。這時會發(fā)現(xiàn)SQLite在大小和功能之間找到了一個理想的平衡 點。完全的開源代碼使其可以稱得上是理想的“嵌入式數(shù)據(jù)庫”。3SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)SQLite是D理查德希普開發(fā)出來的用一個小型C庫實現(xiàn)的一種強有力的嵌入式關(guān)系數(shù)據(jù)庫管理體制。它提供了對SQL92的大多數(shù)支持:支持多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動。這個庫有很強的內(nèi)聚性,通過不到25 000行的ANSI C代碼實現(xiàn),而且可以自由地應(yīng)用于任何目的甚至包括商業(yè)應(yīng)用。此外它還是高速、有效和可升級的,可以運行于從ARM/ Linux到SPARC / Solaris的多種硬件平臺。3.1體系結(jié)構(gòu)圖1SQLite體系結(jié)構(gòu)SQLite 有一種優(yōu)雅、 標(biāo)準(zhǔn)化的設(shè)計。它可以分成8個主要子系統(tǒng),如圖1所示,其中有一些相當(dāng)接近于關(guān)系數(shù)據(jù)庫管理。在圖1的頂層是標(biāo)記處理器(tokenizer)和分析器(parser)。SQLite有自己高度優(yōu)化的分析生成器(檸檬分析器),可以快速地生產(chǎn)出高效率的代碼,而且依靠它新穎的設(shè)計對內(nèi)存泄漏有著特別的抵抗力。在底部是基于Knuth經(jīng)過優(yōu)化的B樹。這樣可以運行在可調(diào)整的頁面緩沖(page cache)上,有助于將對磁盤的查找減到最小。再往下是頁面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數(shù)據(jù)庫的移動。體 系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶和儲存之間信息進行交換的中間單元。從各個方面來看,它都是 SQLite的核心。在SQL語句被分析之后,VDBE開始起作用。代碼生成器將分析樹翻譯成一個袖珍程序,隨后這些袖珍程序又被組合成用VDBE的虛擬 機器語言表示的一系列指令。如此往復(fù),VDBE執(zhí)行每條指令,最終完成SQL語句指定的查詢要求。VDBE 的機器語言由圍繞于數(shù)據(jù)庫管理 128 個操作碼(opcode)組成。對于打開表,查詢索引、存儲和刪除記錄和很多其他數(shù)據(jù)庫操作都有對應(yīng)的操作碼。在VDBE里的每條指令由1個操作碼和3個 操作數(shù)(operand)組成。一些指令使用全部(3個)操作數(shù);也有些可能一個也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開一個表的 指針,使用了全部(3個)操作數(shù):第1個操作數(shù)(P1)包含指針的ID號。第2操作數(shù)(P2)指出表的根位置(或者表的首頁位置);而第3個操作數(shù)則是表 的名字。對于Rollback指令則根本不需要操作數(shù)。為了進行一次Rollback VDBE,僅需知道是否要做Rollback1。3.2SQLite開發(fā)技術(shù)SQLite 的API極其易于使用,只需要三個用來執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴展的,允許程序員自定義函數(shù)然后以callback的形式集合進去。C語 言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開放源碼團體已經(jīng)擴展了眾多的客戶接口、適配器、驅(qū)動等,這就使得其他語言對SQLite的使用 也成為可能。使用C語言API只需要三步。首先,要提供文件名和訪問模式用來調(diào)用sqlite _open()連接數(shù)據(jù)庫。然后,執(zhí)行一個callback函數(shù),SQLite通過對每個記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫那里得到的結(jié)果。最 后,如果想執(zhí)行一個SQL查詢并獲得一個callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯誤代碼檢查。SQLite可 以通過對一個主鍵聲明它為INTEGER PRIMARY KEY成為能夠自動增加的主鍵,實現(xiàn)自增字段。SQLite還提供了存取二進制大對象(BLOBs)的方法,在線程安全、數(shù)據(jù)庫管理、API的擴展等方面也都提供了強大方便的技術(shù)支持。4SQLite在ARMLinux平臺上的實現(xiàn)SQLite嵌入式數(shù)據(jù)庫提供了以源碼發(fā)布的方式,要在眾多的硬件平臺進行移植,可以根據(jù)不同平臺對源碼進行交叉編譯來實現(xiàn)。編譯主要有以下幾個步驟2: 到/的cvs中下載最新的源代碼包,解壓后將生成sqlite目錄,另外新建并轉(zhuǎn)到一個與sqlite目錄平行的同級目錄,如make目錄。 用“echo $PATH”命令查看PATH中是否已經(jīng)包含交叉編譯工具armlinuxgcc。 為了在ARMLinux下能正常運行sqlite,需要對sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹)有正確的 變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會有些差別。對于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進行一些配置。修改sqlite目錄下的configure,讓configure不去檢查交叉編譯環(huán)境。由于篇幅有限不再詳述。 修改Makefile文件。將代碼行 BCC = armlinuxgccgO2改成BCC = gccgO2。另外,一般是以靜態(tài)鏈接的形式將sqlite放到ARMLinux的硬件板上運行的,所以繼續(xù)修改Makefile,找到標(biāo)記為 sqlite:的代碼段,將其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、 libsqlite.a、libsqlite.so。為了減小執(zhí)行文件大小可以用strip處理,去掉其中的調(diào)試信息。 在ARM板上運行sqlite。將sqlite拷貝到ARM板上,方法很多,需要根據(jù)具體的情況來選擇。如ftp、cmdftp、wget等。將sqlite下載到ARM板的/tmp目錄,因為此目錄是可寫的。修改權(quán)限并運行:chmod wx sqlite./sqlite test.sqlite 會出現(xiàn)sqlite 如果一切正常,現(xiàn)在sqlite已經(jīng)在ARMLinux下跑了起來,然后就可以基于此進行進一步的應(yīng)用開發(fā)了。5SQLite的應(yīng)用開發(fā)家 庭網(wǎng)絡(luò)中央控制器以ARM微處理器為中心建立硬件平臺,對外通過寬帶Ethernet、Modem與Internet連接,對內(nèi)將家用電器通過內(nèi)部無線局 域網(wǎng)連接成一體,通過遠(yuǎn)程Web瀏覽器、本地觸摸屏以及電話語音三種方式實現(xiàn)對家用電器的狀態(tài)查詢和控制。多樣化的數(shù)據(jù)存儲與管理需要有一個后臺數(shù)據(jù)庫來 支撐,SQLite無疑是一個合適的選擇。下面就其應(yīng)用程序的編寫方式作一個簡單的介紹。為了講解方便,下面例程通過程序代碼生成了數(shù)據(jù)庫sysdb及其中的一個表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫。#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ù)庫*/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ù)庫*/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ù)庫*/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ù)需要構(gòu)造自己的數(shù)據(jù)庫和callback函數(shù),用來實現(xiàn)具體的功能。支持SQLite的第三方極多,在項目實際開發(fā)中還 針對QT利用qtsqliteplugin插件開發(fā)了圖形程序,用以實現(xiàn)通過觸摸屏的本地交互界面,利用移植的Web服務(wù)器編寫了CGI程序,實現(xiàn)了 B/S模式的遠(yuǎn)程訪問。6總結(jié)在經(jīng)過大量的分析對比之后,針對嵌入式系統(tǒng)開發(fā)的特點,從眾多數(shù)據(jù)庫發(fā)行版中選出非常適用的嵌入式數(shù)據(jù)庫 SQLite。在ARMLinux下完成了對SQLite的編譯,并基于此在項目中作了進一步的開發(fā)工作。實踐證明,SQLite能夠出色地完成嵌入式 系統(tǒng)中的數(shù)據(jù)庫應(yīng)用需求。參考文獻1Michael Owens. Embedding an SQL Database with SQLite. Linux Journal, 200306012How To Compile. /3薛啟康. Linux環(huán)境下的數(shù)據(jù)庫. 中國計算機報, 2001總期號:1009 關(guān)于在qt中如何連接sqlite3數(shù)據(jù)庫的問題/u/16292/showart_136086.html因為我準(zhǔn)備寫一篇很詳細(xì)的有關(guān)這方面的文章,只可惜一直沒有時間。但是最近看到很多朋友問這個問題,這里我就簡單的介紹下。這個是個測試數(shù)據(jù)庫sqlite3以及其C+組件sqlitedataset如何在qt下工作的程序。主要的數(shù)據(jù)庫所需數(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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論