SQLite是一個開源的跨平臺的輕型數據庫,WINCE自己也有一個自帶的數據庫SQLCE ,但佔用的資源會比較大。最近項目中考慮用到 SQLite,所以特別研究了一下,下面介紹一下具體的移植方法。html
1、下載SQLite源碼sql
去SQLite官網http://www.sqlite.org/download.htm下載最新的source code。我下載的是sqlite-amalgamation-3071401.zip。解壓後會得獲得四個文件(shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h)。shell
2、編譯生成WINCE下DLL數據庫
1. 在VS2005下新建一個Win32智能設備項目,選擇相應的SDK,並選擇應用程序類型爲DLL。windows
2. 將sqlite-amalgamation-3071401.zip解壓後的sqlite3.c、sqlite3.h文件拷貝到工程目錄下並添加至工程目錄。以下圖所示。app
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的編譯工做就大功告成了。spa
3、WINCE 下SQLite測試
新建一個SQLite測試程序,測試代碼以下:
[cpp] view plaincopy
#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;
}
4、SQLite可視化管理工具
SQLite自己沒有可視化管理工具,只提供了一個命令行的管理工具SQLite.exe。有一個第三方的可視化管理工具Sqlite Expert,用着還能夠,下載地址: http://www.sqliteexpert.com/download.html