直播推薦
企業(yè)動(dòng)態(tài)
- 紛享銷(xiāo)客發(fā)布首個(gè)企業(yè)級(jí)智能CRM平臺(tái)ShareAI
- 揭秘西企業(yè)數(shù)字化+低碳化轉(zhuǎn)型“工具箱”:西門(mén)子X(jué)celerator
- 企業(yè)AI賦能數(shù)智制造,用友U9 cloud世界級(jí)云ERP煥新升級(jí)
- 《“智“領(lǐng)石化,“質(zhì)“造未來(lái)——威圖石化行業(yè)數(shù)智化實(shí)踐白皮書(shū)》隆重發(fā)布
- 攜手共贏!德國(guó)Agfa搭載瑞典IPCO鋼帶,實(shí)現(xiàn)印刷設(shè)備振動(dòng)銳減6倍,提升印刷速度與精度
- 創(chuàng)四方集團(tuán)榮獲“知名商標(biāo)品牌閃亮”證書(shū),助力品牌戰(zhàn)略升級(jí)
- 皇冠CAD(CrownCAD)2025 R3版本來(lái)了,率先開(kāi)啟C“Ai”D時(shí)代!
- 電費(fèi)砍半!中國(guó)制冷展:海爾發(fā)布AI建筑最新成果
推薦展會(huì)
摘 要 SQLite作為一個(gè)開(kāi)源的嵌入式數(shù)據(jù)庫(kù)產(chǎn)品,具有系統(tǒng)開(kāi)銷(xiāo)小,檢索效率高的特性,適用于手機(jī)、PDA、機(jī)頂盒設(shè)備等電器,并且作為嵌入式數(shù)據(jù)庫(kù)在可下載的消費(fèi)類(lèi)應(yīng)用程序中運(yùn)行的很好。這篇文章介紹嵌入式數(shù)據(jù)庫(kù)產(chǎn)品SQLite的技術(shù)特點(diǎn),并著重討論研究與Java語(yǔ)言之間的接口,并以實(shí)例說(shuō)明如何使用JAVA開(kāi)發(fā)基于SQLite的應(yīng)用程序。
關(guān)鍵詞 嵌入式數(shù)據(jù)庫(kù);SQLITE; JAVA;JNI接口;JDBC驅(qū)動(dòng)程序
1 引 言
通常我們采用各種數(shù)據(jù)庫(kù)產(chǎn)品來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的存儲(chǔ)、檢索等功能,例如,Oracle,SQL Server,MySQL等等。這些產(chǎn)品除提供基本的查詢(xún),刪除,添加等功能外,也提供了很多特性,如觸發(fā)器,存儲(chǔ)過(guò)程,數(shù)據(jù)備份恢復(fù),全文檢索功能等。但實(shí)際上,很多的應(yīng)用,僅僅利用到了這些數(shù)據(jù)庫(kù)產(chǎn)品的基本特性而已。而且在一些小型應(yīng)用上,或者某些特殊場(chǎng)合的應(yīng)用,比如桌面程序,這些數(shù)據(jù)庫(kù)產(chǎn)品就明顯有一些臃腫。在這些情況下,嵌入式數(shù)據(jù)庫(kù)的優(yōu)勢(shì)就特別明顯了。
嵌入式數(shù)據(jù)庫(kù)無(wú)須獨(dú)立運(yùn)行的數(shù)據(jù)庫(kù)引擎,它是由程序直接調(diào)用相應(yīng)的API去實(shí)現(xiàn)對(duì)數(shù)據(jù)的存取操作。更直白的講,嵌入式數(shù)據(jù)庫(kù)是一種具備了基本數(shù)據(jù)庫(kù)特性的數(shù)據(jù)文件。嵌入式數(shù)據(jù)庫(kù)與其它數(shù)據(jù)庫(kù)產(chǎn)品的區(qū)別是,前者是程序驅(qū)動(dòng)式, 而后者是引擎響應(yīng)式。嵌入式數(shù)據(jù)庫(kù)的一個(gè)很重要的特點(diǎn)是它們的體積非常小,編譯后的產(chǎn)品也不過(guò)幾十K。這不但對(duì)桌面程序的數(shù)據(jù)存儲(chǔ)方案是一個(gè)很好的選擇,也使得它們可以應(yīng)用到一些移動(dòng)設(shè)備上。同時(shí),很多嵌入式數(shù)據(jù)庫(kù)在性能上也優(yōu)于其它數(shù)據(jù)庫(kù),所以在高性能的應(yīng)用上也常見(jiàn)嵌入式數(shù)據(jù)庫(kù)的身影。
下面介紹的是開(kāi)放源代碼的嵌入式數(shù)據(jù)庫(kù),SQLite。同時(shí)側(cè)重研究如何應(yīng)用Java連接SQLite數(shù)據(jù)庫(kù),并開(kāi)發(fā)基于SQLite的應(yīng)用程序。
2 SQLite簡(jiǎn)介
SQLite 是D ·理查德·希普開(kāi)發(fā)出來(lái)的用一個(gè)小型C 庫(kù)實(shí)現(xiàn)的一種強(qiáng)有力的嵌入式關(guān)系數(shù)據(jù)庫(kù)管理體制。它提供了對(duì)SQL92 的大多數(shù)支持: 支持多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶(hù)接口及驅(qū)動(dòng) [1]。
SQLite 實(shí)現(xiàn)了完備的、可嵌入的、零配置的SQL數(shù)據(jù)庫(kù)引擎。它的特點(diǎn)包括 [2]:
1. 事務(wù)處理是原子的、一致的、獨(dú)立的和持久的(ACID),即使在系統(tǒng)崩潰和掉電以后。
2. 零配置,即不需要設(shè)置和管理。
3. 實(shí)現(xiàn)了絕大部分的SQL92標(biāo)準(zhǔn)。
4. 一個(gè)單獨(dú)的磁盤(pán)文件存儲(chǔ)一個(gè)完整的數(shù)據(jù)庫(kù)。
5. 數(shù)據(jù)庫(kù)文件在機(jī)器之間可自由共享。
6. 支持?jǐn)?shù)據(jù)庫(kù)文件大小至2TB.
7. 字符串和BLOG的大小只受限于可用存儲(chǔ)器容量。
8. 代碼量小,即小于30K的C代碼行和小于250K的代碼空間(gcc 在i486上)
9. 對(duì)于絕大多數(shù)普通操作來(lái)說(shuō),比流行的C/S 模式的數(shù)據(jù)庫(kù)引擎運(yùn)行速度快。
10. API 簡(jiǎn)單、易用。
可以看出,基于以上特點(diǎn),SQLite非常適合應(yīng)用于嵌入式移動(dòng)數(shù)據(jù)庫(kù)。SQLite的版權(quán)允許無(wú)任何限制的應(yīng)用,包括商業(yè)性的產(chǎn)品。SQLite*主站上可以下載到編譯后的SQLite程序。
3 建立SQLite 數(shù)據(jù)庫(kù)
SQLite是無(wú)數(shù)據(jù)類(lèi)型的數(shù)據(jù)庫(kù)。雖然在生成表結(jié)構(gòu)的時(shí)候,要聲明每個(gè)域的數(shù)據(jù)類(lèi)型,但SQLite并不做任何檢查。開(kāi)發(fā)人員要靠自己的程序控制輸入與讀出數(shù)據(jù)的類(lèi)型是正確的。這里有一個(gè)例外,就是當(dāng)主鍵為整型值時(shí),如果要插入一個(gè)非整型值時(shí)會(huì)產(chǎn)生異常。另外,雖然在插入或讀出數(shù)據(jù)的時(shí)候是不區(qū)分類(lèi)型的,但在比較的時(shí)候,不同數(shù)據(jù)類(lèi)型是有區(qū)別的。比如:
CREATE TABLE MyTable(a INTEGER, b TEXT);
INSERT INTO MyTable VALUES(0,0);
當(dāng)執(zhí)行下面的查詢(xún):
SELECT count(*) FROM MyTable WHERE a==''00'';
會(huì)返回一條記錄,因?yàn)樽侄蝍的類(lèi)型是整型,而數(shù)字00與0是相等的。而執(zhí)行下面的查詢(xún)則不會(huì)返回記錄:
SELECT count(*) FROM MyTable WHERE b==''00'';
因?yàn)樽侄蝏是字符類(lèi)型,字符"00"與"0"是不相等的。
SQLite提供了對(duì)Transaction的支持。應(yīng)用Transaction即保證了數(shù)據(jù)的完整性,也會(huì)提高運(yùn)行速度,因?yàn)槎鄺l語(yǔ)句一起提交給數(shù)據(jù)庫(kù)的速度會(huì)比一條一條的提交方式更快。
SQLite庫(kù)包括一個(gè)簡(jiǎn)單的命令行工具,該工具名稱(chēng)對(duì)應(yīng)SQLite-3_2_2版本叫做sqlite3,用戶(hù)使用這個(gè)工具可以對(duì)一個(gè)SQLite數(shù)據(jù)庫(kù)手工輸入和執(zhí)行SQL命令。例如建立一個(gè)名叫wgy的SQLite數(shù)據(jù)庫(kù),并建立一個(gè)名叫user的表的步驟如下:
Sqlite3 wgy
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> create table user(username varchar(10), password varchar(10));
sqlite> into user values(''Marry'',’111111’);
sqlite> into tbl1 values(''Helen'',’222222’);
sqlite> * from user;
Marry|111111
Helen|222222
Sqlite>
用戶(hù)結(jié)束操作只需按CTRL+C組合鍵。注意每條SQL命令后要加分號(hào)。
用戶(hù)可能對(duì)命令行方式的操作感到不直觀,不太容易使用。那么用戶(hù)可以使用 SQLite Database Browser 軟件 [3],這是一個(gè)免費(fèi)的、公用域的、開(kāi)源的可視化工具,可以用來(lái)建立、編輯SQLite數(shù)據(jù)庫(kù)文件。這就意味著用戶(hù)可以不必學(xué)習(xí)復(fù)雜的SQL命令,而直接使用熟悉的可視化圖形界面設(shè)計(jì)、編輯SQLite數(shù)據(jù)庫(kù)。用戶(hù)可從/ 下載該工具軟件。
4 SQLite的第三方JAVA接口
SQLite源代碼是C,而且*上只提供了C和Tcl語(yǔ)言的接口。為了應(yīng)用Java接口,要采用第三方的接口驅(qū)動(dòng)程序,可在http://www.ch-werner.de/javasqlite 中找到這個(gè)Java接口程序 [4]。這個(gè)接口提供了兩種連接SQLite的方式:一是直接用JNI技術(shù)調(diào)用SQLite的C語(yǔ)言接口,這種方式要求開(kāi)發(fā)人員要對(duì)SQLite本身的API也有一定的了解。在第二種方式中,接口程序?qū)崿F(xiàn)了Java標(biāo)準(zhǔn)規(guī)范的JDBC接口,這樣開(kāi)發(fā)人員只要對(duì)JDBC有了解就可以了。
第三方接口庫(kù)中的Java代碼包含JNI接口和多個(gè)版本的JDBC接口程序,可根據(jù)你的JRE的版本選擇相應(yīng)的JDBC程序。Java類(lèi)包加上Sqlite_jni.dll文件,組成了SQLite的Java接口庫(kù),在應(yīng)用Java語(yǔ)言調(diào)用JDBC或JNI接口時(shí),都是通過(guò)應(yīng)用Java的本地化技術(shù)調(diào)用Sqlite_jni.dll文件,完成對(duì)SQLite數(shù)據(jù)庫(kù)的操作。
4.1應(yīng)用JNI直接調(diào)用SQLite功能
下面這段代碼演示如何應(yīng)用JNI接口操作SQLite??梢钥吹紻atabase類(lèi)的exec()方法是執(zhí)行SQL語(yǔ)句的關(guān)鍵:
Database db = new Database();
try {
//打開(kāi)數(shù)據(jù)庫(kù)
db.open("c:tempmydata.slt", 0666);
db.interrupt();
db.busy_timeout(1000);
db.busy_handler(null);
db.exec("create table account (name varchar(10),gale boolean)"
,result);
db.exec("into account values(''steve'',''m'')", result);
db.exec("* from account",result);
//關(guān)閉數(shù)據(jù)庫(kù)
db.close();
} catch (Exception e) {
e.printStackTrace();
}
4.2 應(yīng)用JDBC連接SQLite
用戶(hù)一定要保證在類(lèi)路徑class_path中有“sqlite.jar”,并且保證在你的JAVA庫(kù)路徑JAVA library path 中有本地庫(kù)native library。用"SQLite.JDBCDriver"作為JDBC的驅(qū)動(dòng)程序類(lèi)名。連接JDBC的URL格式為jdbc:sqlite:/path。這里的path為到SQLite數(shù)據(jù)庫(kù)文件的路徑,例如:
jdbc:sqlite://dirA/dirB/dbfile迎訪問(wèn)無(wú)由電子開(kāi)發(fā)網(wǎng)(技術(shù)文章 在線閱讀 在線商城
jdbc:sqlite://DRIVE:/dirA/dirB/dbfile
jdbc:sqlite://COMPUTERNAME/shareA/dirB/dbfile
參考下面的應(yīng)用JDBC連接SQLite的例程:
//聲明JDBC驅(qū)動(dòng)程序
Class clz = Class.forName("SQLite.JDBCDriver");
//連接數(shù)據(jù)庫(kù)
Connection conn = DriverManager.getConnection("jdbc:sqlite:/c:/temp/e2.db");
Statement stmt = conn.createStatement();
//生成person表,包含名子和年齡字段
stmt.execute("create table person (name varchar(100),age int)");
//插入數(shù)據(jù)
stmt.execute("into person values(''steve'',25)");
//用SQL語(yǔ)句讀出數(shù)據(jù)
result = stmt.executeQuery("* from person");
while(result.next()){
System.out.println(result.getString(1));
System.out.println(result.getInt(2));
}
運(yùn)行程序時(shí)要在Java.exe命令行加入選項(xiàng)java.library.path到Sqlite_jni.dll所在的路徑。例如,如果Sqlite_jni.dll放在c:\sqliteNative 路徑下面,運(yùn)行類(lèi)com.wangguanyu.MyClass 的命令行將會(huì)是這樣:java -Djava.library.path=c:\sqliteNative com.wangguanyu.MyClass。
5結(jié)束語(yǔ)
SQLite已于2005年6月13日發(fā)布了Version 3.2.2, 該版本不僅修正了許多的BUG,而且訪問(wèn)速度更快,產(chǎn)生的代碼量更少。而JAVA程序又具有簡(jiǎn)單易學(xué)、面向?qū)ο?、平臺(tái)無(wú)關(guān)性、穩(wěn)定安全等特點(diǎn)。兩者結(jié)合起來(lái)開(kāi)發(fā)的應(yīng)用程序必然兼具兩方面的優(yōu)勢(shì)。SOC開(kāi)發(fā)平臺(tái)360元 單片機(jī)開(kāi)發(fā)系統(tǒng)498元 單片機(jī)學(xué)習(xí)板138 無(wú)線nRF-9E5模塊100元 51單片機(jī)試驗(yàn)開(kāi)發(fā)板238元 Genius NSP通用編程器260元 Mini ARM Debugger330元 LABTOOL-48UXP2800元 S3C2410 ARM9開(kāi)發(fā)板800
參 考 文 獻(xiàn)
[1] 黃布毅 張曉華 基于ARM2Linux 的SQLite 嵌入式數(shù)據(jù)庫(kù)技術(shù)[J] 單片機(jī)與嵌入式系統(tǒng)應(yīng)用 2005-4: 22
[2] / [ EB/ OL ]
[3] / [ EB/ OL ]
[4] http://www.ch-werner.de/javasqlite [ EB/ OL ]
免責(zé)聲明
- 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://towegas.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
- 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
- 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
- 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
2025第十一屆中國(guó)國(guó)際機(jī)電產(chǎn)品交易會(huì) 暨先進(jìn)制造業(yè)博覽會(huì)
展會(huì)城市:合肥市展會(huì)時(shí)間:2025-09-20