SQLite是一個開源的跨平台的輕型資料庫,WINCE本身也有一個內建的資料庫SQLCE ,但佔用的資源會比較大。最近項目中考慮用到 SQLite,因此特別研究了一下,下面介紹一下具體的移植方法。
一、下載SQLite源碼
去SQLite官網http://www.sqlite.org/download.htm下載最新的source code。我下載的是sqlite-amalgamation-3071401.zip。解壓後會得得到四個檔案(shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h)。
二、編譯產生WINCE下DLL
1. 在VS2005下建立一個Win32智慧型裝置項目,選擇相應的SDK,並選擇應用程式類型為DLL。
2. 將sqlite-amalgamation-3071401.zip解壓後的sqlite3.c、sqlite3.h檔案拷貝到工程目錄下並添加至工程目錄。如所示。
3.在預先處理中增加SQLITE_ENABLE_RTREE和SQLITE_ENABLE_COLUMN_METADATA宏定義。:
4.編譯項目,會提示“error LNK2019: 無法解析的外部符號 localtime_s,該符號在函數 osLocaltime 中被引用”錯誤,此錯誤的解決方案是將localtime_s替換成_localtime64_s即可。
5.編譯成功後會發現目錄下會產生SQLite.dll檔案,但會發現沒有lib檔案,這樣在使用這個DLL時是沒法編譯的,所以還需要匯出.lib檔案,解決方案是在SQLite官網上下載sqlite-dll-win32-x86-XXXXXX.zip檔案,解壓後將目錄下的sqlite3.def檔案拷貝到DLL工程目錄,在項目屬性--連結器--輸入--模組定義檔案中添加sqlite3.def,如所示,然後編譯即可。
這樣SQLite的編譯工作就大功告成了。
三、WINCE 下SQLite測試
建立一個SQLite測試程式,測試代碼如下:
#include <windows.h>// sqlite3的回呼函數int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name )int main(int argc,char* argv[]){sqlite3 * db = NULL; //聲明sqlite關鍵結構指標int result;// 開啟或建立資料庫result = sqlite3_open("NAND2\\sqlite.db", &db );if( result != SQLITE_OK ){//資料庫開啟失敗return -1;}char * errmsg = NULL;// 資料庫作業碼#if 1// 建立一個測試表,表名叫 MyTable,有2個欄位: ID 和 name。其中ID是一個自動增加的類型,以後insert時可以不去指定這個欄位,它會自己從0開始增加result = sqlite3_exec( db, "create table MyTable( ID integer primary key autoincrement, name nvarchar(32) )", NULL, NULL, &errmsg );if(result != SQLITE_OK ){printf("建立表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );}// 插入記錄result = sqlite3_exec( db, "insert into MyTable( name ) values ( '張三' )", 0, 0, &errmsg );if(result != SQLITE_OK ){printf("插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );}// 插入記錄result = sqlite3_exec( db, "insert into MyTable( name ) values ( '李四' )", 0, 0, &errmsg );if(result != SQLITE_OK ){printf("插入記錄失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg );}#endif// 開始查詢資料庫result = sqlite3_exec( db, "select * from MyTable", SQLiteQueryResultCallBack, NULL, &errmsg );// 關閉資料庫sqlite3_close( db );return 0;}// sqlite3的回呼函數int SQLiteQueryResultCallBack( void * para, int n_column, char ** column_value, char ** column_name ){printf( "******************************\n" );printf("記錄包含 %d 個欄位\n", n_column );for(int i = 0 ; i < n_column; i ++ ){printf( "欄位名:%s 欄位值:%s\n", column_name[i], column_value[i] );}printf( "******************************\n" );return 0;}
四、SQLite可視化管理工具
SQLite本身沒有可視化管理工具,只提供了一個命令列的管理工具SQLite.exe。有一個第三方的可視化管理工具Sqlite Expert,用著還可以,: http://www.sqliteexpert.com/download.html