




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式開(kāi)發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)引言1Linux下常見(jiàn)的數(shù)據(jù)庫(kù)技術(shù)分析(1)PostgreSQL(2)MySQL(3)mSQL(miniSQL)(4)BerkeleyDB(5)SQLite2嵌入式開(kāi)發(fā)對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)3SQLite的體系結(jié)構(gòu)及開(kāi)發(fā)技術(shù)3.1體系結(jié)構(gòu)3.2SQLite開(kāi)發(fā)技術(shù)4SQLite在armLinux平臺(tái)上的實(shí)現(xiàn)5SQLite的應(yīng)用開(kāi)發(fā)6總結(jié)隨著嵌入式系統(tǒng)的廣泛應(yīng)用和用戶(hù)對(duì)數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備和數(shù)據(jù)庫(kù)技術(shù)的緊密結(jié)合已經(jīng)得到了各方面的重視。不久的將來(lái)嵌入式數(shù)據(jù)庫(kù)將無(wú)處不在??v觀目前國(guó)際、國(guó)內(nèi)嵌入式數(shù)據(jù)庫(kù)的應(yīng)用情況,目前基于嵌入式數(shù)據(jù)庫(kù)應(yīng)用的市場(chǎng)已經(jīng)進(jìn)入加速發(fā)展的階段。引言基于Linux平臺(tái)的數(shù)據(jù)庫(kù)非常多,大型的商用數(shù)據(jù)庫(kù)有Oracle、Sybase、Informix、Informix、IBMDB2等;中小型的更是不勝枚舉,以下是常見(jiàn)的幾種。1嵌入式開(kāi)發(fā)教程Linux下常見(jiàn)的數(shù)據(jù)庫(kù)技術(shù)分析PostgreSQL是世界上最優(yōu)秀的開(kāi)放源碼的數(shù)據(jù)庫(kù)之一,是完全免費(fèi)的數(shù)據(jù)庫(kù),不需要任何版權(quán)費(fèi)用和購(gòu)買(mǎi)費(fèi)。因此,它是許多Linux發(fā)行版本的首選,例如:Redhat、TurboLinux都預(yù)裝了PostgreSQL。PostgreSQL兼容性很強(qiáng),如果是SQL92兼容的,移植PostgreSQL非常簡(jiǎn)單和快捷。(1)嵌入式開(kāi)發(fā)教程PostgreSQLMySQL是多用戶(hù)、多進(jìn)程的SQLdatabaseserver。MySQL包括一個(gè)serverdaemon(mysqld)和clientprograms與libraries的client/server實(shí)現(xiàn)工具;比較適合小而簡(jiǎn)單的數(shù)據(jù)庫(kù),對(duì)復(fù)雜的操作要求支持不是很好。MySQL的licensingpolicy:如果你是普通的最終用戶(hù),使用MySQL不需要付錢(qián);但如果是直接或間接地出售MySQL的服務(wù)程序或相關(guān)產(chǎn)品,或是在一些客戶(hù)端維護(hù)MySQLserver并收取費(fèi)用,或是在發(fā)行版中包括MySQL,就需要獲得許可。
*本課題是2003年河南省杰出人才創(chuàng)新基金項(xiàng)目(0321000300),獲得了河南省科技廳的資金支持。(2)嵌入式開(kāi)發(fā)教程MySQLmSQL是一個(gè)單用戶(hù)數(shù)據(jù)庫(kù)管理系統(tǒng)。由于它的短小精悍,使其開(kāi)發(fā)的應(yīng)用系統(tǒng)特別受到互聯(lián)網(wǎng)用戶(hù)青睞。mSQL并非是完全的freeware,若是在大學(xué)中使用此一軟件,或是為了學(xué)術(shù)研究與慈善等非營(yíng)利性目的,才能免費(fèi)得到使用權(quán)(freelicense),否則就得付費(fèi)注冊(cè)才能得到正式的版權(quán)。(3)嵌入式開(kāi)發(fā)教程mSQL(miniSQL)BerkeleyDB是一個(gè)開(kāi)放源代碼的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),能夠?yàn)閼?yīng)用程序提供高性能的數(shù)據(jù)管理服務(wù)。應(yīng)用它,程序員只需要調(diào)用一些簡(jiǎn)單的API就可以完成對(duì)數(shù)據(jù)的訪問(wèn)和管理。與常用的數(shù)據(jù)庫(kù)管理系統(tǒng)(如MySQL和Oracle等)有所不同,在BerkeleyDB中并沒(méi)有數(shù)據(jù)庫(kù)服務(wù)器的概念。應(yīng)用程序不需要事先同數(shù)據(jù)庫(kù)服務(wù)建立起網(wǎng)絡(luò)連接,而是通過(guò)內(nèi)嵌在程序中的BerkeleyDB函數(shù)庫(kù)來(lái)完成對(duì)數(shù)據(jù)的保存、查詢(xún)、修改和刪除等操作。(4)嵌入式開(kāi)發(fā)教程BerkeleyDBSQLite支持絕大多數(shù)標(biāo)準(zhǔn)的SQL92語(yǔ)句,采用單文件存放數(shù)據(jù)庫(kù),速度又比MySQL快上1~2倍(官方的數(shù)據(jù)),存儲(chǔ)量也不是問(wèn)題。在操作語(yǔ)句上更類(lèi)似關(guān)系型數(shù)據(jù)庫(kù)的產(chǎn)品使用,非常方便。SQLite的版權(quán)允許無(wú)任何限制的應(yīng)用,包括商業(yè)性的產(chǎn)品。在PHP5中已經(jīng)集成了這個(gè)輕巧的嵌入式數(shù)據(jù)庫(kù)產(chǎn)品。(5)嵌入式開(kāi)發(fā)教程SQLite在眾多的數(shù)據(jù)庫(kù)中,如何選擇適用于嵌入式系統(tǒng)的數(shù)據(jù)庫(kù)呢?嵌入式系統(tǒng)開(kāi)發(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)的功能嵌入式開(kāi)發(fā)中有很多應(yīng)用,用戶(hù)需求決定了開(kāi)發(fā)中需要有一個(gè)大小適中且功能齊備的數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的管理。對(duì)開(kāi)發(fā)人員來(lái)說(shuō),要求采用的數(shù)據(jù)庫(kù)技術(shù)提供完備開(kāi)發(fā)的文檔而且易于開(kāi)發(fā)。(3)開(kāi)源的代碼作為產(chǎn)品的開(kāi)發(fā),開(kāi)源的代碼不僅可以減少產(chǎn)品的生產(chǎn)成本,更重要的是為產(chǎn)品的維護(hù)完善和穩(wěn)定運(yùn)行都提供了最為徹底的解決手段。2嵌入式開(kāi)發(fā)對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)上面介紹的數(shù)據(jù)庫(kù)技術(shù)中,Oracle、Sybase、Informix、IBMDB2等功能強(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ì)于嵌入式開(kāi)發(fā)來(lái)說(shuō)空間占用仍然太大,目前還不適用。
mSQL是一種簡(jiǎn)化的SQL數(shù)據(jù)庫(kù),短小精悍,開(kāi)發(fā)方便,適用于嵌入式開(kāi)發(fā);但mSQL只有30天的使用期限,并非完全的開(kāi)源。余下的開(kāi)放源碼數(shù)據(jù)庫(kù)中,PostgreSQL是Linux下最完善的開(kāi)源SQL數(shù)據(jù)庫(kù),但體積也較大。BerkeleyDB作為完全開(kāi)源的嵌入式數(shù)據(jù)庫(kù)速度極快,可靠性高;但學(xué)習(xí)起來(lái)有一定難度,必然會(huì)加大開(kāi)發(fā)成本。
SQLite則簡(jiǎn)單易用,速度也很快,同時(shí)提供了豐富的數(shù)據(jù)庫(kù)接口,功能雖較BerkeleyDB略有遜色,但在開(kāi)源社區(qū)的推動(dòng)下差距正在縮小。它的設(shè)計(jì)思想是小型、快速和最小化的管理。這對(duì)于需要一個(gè)數(shù)據(jù)庫(kù)用于存儲(chǔ)數(shù)據(jù),但又不想花太多時(shí)間來(lái)調(diào)整數(shù)據(jù)性能的開(kāi)發(fā)人員很適用。實(shí)際上在很多情況下,并不需要存儲(chǔ)程序或復(fù)雜的表之間的關(guān)聯(lián)。這時(shí)會(huì)發(fā)現(xiàn)SQLite在大小和功能之間找到了一個(gè)理想的平衡點(diǎn)。完全的開(kāi)源代碼使其可以稱(chēng)得上是理想的“嵌入式數(shù)據(jù)庫(kù)”。嵌入式開(kāi)發(fā)教程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)。這個(gè)庫(kù)有很強(qiáng)的內(nèi)聚性,通過(guò)不到25000行的ANSIC代碼實(shí)現(xiàn),而且可以自由地應(yīng)用于任何目的甚至包括商業(yè)應(yīng)用。此外它還是高速、有效和可升級(jí)的,可以運(yùn)行于從arm/Linux到SPARC/Solaris的多種硬件平臺(tái)。3嵌入式開(kāi)發(fā)教程SQLite的體系結(jié)構(gòu)及開(kāi)發(fā)技術(shù)圖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)過(guò)優(yōu)化的B樹(shù)。這樣可以運(yùn)行在可調(diào)整的頁(yè)面緩沖(pagecache)上,有助于將對(duì)磁盤(pán)的查找減到最小。再往下是頁(yè)面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數(shù)據(jù)庫(kù)的移動(dòng)。體系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫(kù)引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶(hù)和儲(chǔ)存之間信息進(jìn)行交換的中間單元。從各個(gè)方面來(lái)看,它都是SQLite的核心。在SQL語(yǔ)句被分析之后,VDBE開(kāi)始起作用。代碼生成器將分析樹(shù)翻譯成一個(gè)袖珍程序,隨后這些袖珍程序又被組合成用VDBE的虛擬機(jī)器語(yǔ)言表示的一系列指令。如此往復(fù),VDBE執(zhí)行每條指令,最終完成SQL語(yǔ)句指定的查詢(xún)要求。3.1嵌入式開(kāi)發(fā)教程體系結(jié)構(gòu)VDBE的機(jī)器語(yǔ)言由圍繞于數(shù)據(jù)庫(kù)管理128個(gè)操作碼(opcode)組成。對(duì)于打開(kāi)表,查詢(xún)索引、存儲(chǔ)和刪除記錄和很多其他數(shù)據(jù)庫(kù)操作都有對(duì)應(yīng)的操作碼。在VDBE里的每條指令由1個(gè)操作碼和3個(gè)操作數(shù)(operand)組成。一些指令使用全部(3個(gè))操作數(shù);也有些可能一個(gè)也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開(kāi)一個(gè)表的指針,使用了全部(3個(gè))操作數(shù):第1個(gè)操作數(shù)(P1)包含指針的ID號(hào)。第2操作數(shù)(P2)指出表的根位置(或者表的首頁(yè)位置);而第3個(gè)操作數(shù)則是表的名字。對(duì)于Rollback指令則根本不需要操作數(shù)。為了進(jìn)行一次RollbackVDBE,僅需知道是否要做Rollback\[1\]。嵌入式開(kāi)發(fā)教程SQLite的API極其易于使用,只需要三個(gè)用來(lái)執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴(kuò)展的,允許程序員自定義函數(shù)然后以callback的形式集合進(jìn)去。C語(yǔ)言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開(kāi)放源碼團(tuán)體已經(jīng)擴(kuò)展了眾多的客戶(hù)接口、適配器、驅(qū)動(dòng)等,這就使得其他語(yǔ)言對(duì)SQLite的使用也成為可能。使用C語(yǔ)言API只需要三步。首先,要提供文件名和訪問(wèn)模式用來(lái)調(diào)用sqlite_open()連接數(shù)據(jù)庫(kù)。然后,執(zhí)行一個(gè)callback函數(shù),SQLite通過(guò)對(duì)每個(gè)記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫(kù)那里得到的結(jié)果。最后,如果想執(zhí)行一個(gè)SQL查詢(xún)并獲得一個(gè)callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯(cuò)誤代碼檢查。SQLite可以通過(guò)對(duì)一個(gè)主鍵聲明它為INTEGERPRIMARYKEY成為能夠自動(dòng)增加的主鍵,實(shí)現(xiàn)自增字段。
SQLite還提供了存取二進(jìn)制大對(duì)象(BLOBs)的方法,在線程安全、數(shù)據(jù)庫(kù)管理、API的擴(kuò)展等方面也都提供了強(qiáng)大方便的技術(shù)支持。3.2嵌入式開(kāi)發(fā)教程SQLite開(kāi)發(fā)技術(shù)SQLite嵌入式數(shù)據(jù)庫(kù)提供了以源碼發(fā)布的方式,要在眾多的硬件平臺(tái)進(jìn)行移植,可以根據(jù)不同平臺(tái)對(duì)源碼進(jìn)行交叉編譯來(lái)實(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樹(shù))有正確的變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會(huì)有些差別。對(duì)于armLinux可以找到如下部分:#ifndefINTPTR_TYPE
#ifSQLITE_PTR_SZ==44嵌入式開(kāi)發(fā)教程SQLite在armLinux平臺(tái)上的實(shí)現(xiàn)
#defineINTPTR_TYPEint
#else
#defineINTPTR_TYPElonglong
#endif在上面的代碼前加上一句#defineSQLITE_PTR_SZ4這樣后面的“typedefINTPTR_TYPEptr;”就是定義的“int”類(lèi)型,而不是“l(fā)onglong”。
④使用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)試信息。嵌入式開(kāi)發(fā)教程
⑥在ARM板上運(yùn)行sqlite。將sqlite拷貝到arm板上,方法很多,需要根據(jù)具體的情況來(lái)選擇。如ftp、cmdftp、wget等。將sqlite下載到arm板的/tmp目錄,因?yàn)榇四夸浭强蓪?xiě)的。修改權(quán)限并運(yùn)行:chmod+wxsqlite
./sqlitetest.sqlite會(huì)出現(xiàn)sqlite>如果一切正常,現(xiàn)在sqlite已經(jīng)在armLinux下跑了起來(lái),然后就可以基于此進(jìn)行進(jìn)一步的應(yīng)用開(kāi)發(fā)了。嵌入式開(kāi)發(fā)教程家庭網(wǎng)絡(luò)中央控制器以arm微處理器為中心建立硬件平臺(tái),對(duì)外通過(guò)寬帶Ethernet、Modem與Internet連接,對(duì)內(nèi)將家用電器通過(guò)內(nèi)部無(wú)線局域網(wǎng)連接成一體,通過(guò)遠(yuǎn)程Web瀏覽器、本地觸摸屏以及電話(huà)語(yǔ)音三種方式實(shí)現(xiàn)對(duì)家用電器的狀態(tài)查詢(xún)和控制。多樣化的數(shù)據(jù)存儲(chǔ)與管理需要有一個(gè)后臺(tái)數(shù)據(jù)庫(kù)來(lái)支撐,SQLite無(wú)疑是一個(gè)合適的選擇。下面就其應(yīng)用程序的編寫(xiě)方式作一個(gè)簡(jiǎn)單的介紹。為了講解方便,下面例程通過(guò)程序代碼生成了數(shù)據(jù)庫(kù)sysdb及其中的一個(gè)表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫(kù)。
#include<string.h>
#include"sqlite.h"
intcallback(void*p_data,intnum_fields,char**p_fields,
char**p_col_names);5嵌入式開(kāi)發(fā)教程SQLite的應(yīng)用開(kāi)發(fā)
main(){
FILE*inp_fp;
intret;
intnrecs=0;
char*errmsg;
sqlite*p_db;
unsignedchar*sqlcommand;
unsignedchar*sqlcreatedb;
sqlcommand="select*fromuser;";
sqlcreatedb="createtableuser(idnumeric,nametext);";
/*建立數(shù)據(jù)庫(kù)*/
if((inp_fp=fopen("./sysdb","r"))==NULL){
printf("Cannotfinddatabasefile!\\n");嵌入式開(kāi)發(fā)教程
printf("Recoverthedatabasefile...\\n");
p_db=sqlite_open("./sysdb",0777,0);
sqlite_exec(p_db,sqlcreatedb,0,0,0);
printf("Thedatabasefilehavebeenrecorvered!\\n");
sqlite_close(p_db);
}
/*打開(kāi)數(shù)據(jù)庫(kù)*/
sqlite*p_db=sqlite_open("./sysdb",0777,0);
/*選擇user表中的所有記錄.*/
ret=sqlite_exec(p_db,sqlcommand,callback,&nrecs,
errmsg);嵌入式開(kāi)發(fā)教程
if(ret!=SQLITE_OK){
printf("Error
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)DTRO膜行業(yè)發(fā)展歷程、市場(chǎng)概況及未來(lái)發(fā)展前景研究報(bào)告
- 項(xiàng)目文檔控制管理協(xié)議書(shū)(2篇)
- 風(fēng)險(xiǎn)投資融資協(xié)議書(shū)(2篇)
- 2025至2031年中國(guó)氣動(dòng)稀油加注機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)巧克力西餅行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)全棉6條燈芯絨行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 編輯記者招聘考試新聞寫(xiě)作試卷與答案
- 二零二五年度泳池設(shè)施損壞賠償免責(zé)協(xié)議
- 二零二五年度金融科技企業(yè)競(jìng)業(yè)禁止及金融數(shù)據(jù)保密協(xié)議
- 2025年度終止租賃藝術(shù)畫(huà)廊租賃合同終止協(xié)議
- 科學(xué)研究方法與學(xué)術(shù)論文寫(xiě)作
- 最新人音版音樂(lè)二年級(jí)下冊(cè)全冊(cè)教案
- 航空航天概論(課堂PPT)
- 新改版教科版六年級(jí)下冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)歸納 (超全)
- 英語(yǔ)的起源與發(fā)展(課堂PPT)
- 藥物化學(xué)結(jié)構(gòu)式大全(高清版)
- 二房東租房合同范文
- 影視旅游作品對(duì)游客出游動(dòng)機(jī)及行為意向的影響研究
- 物業(yè)工程人員入戶(hù)維修流程
- 【圖文】煤礦井下常見(jiàn)的失爆現(xiàn)象
- 我的寒假生活模板
評(píng)論
0/150
提交評(píng)論