在WinCE,Mobile上,对SQLite的开发,目前还是以.net compact framework的封装居多.
在 http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers 可找到各种语言对 SQLite 的封装.
下面将介绍如何在EVC下使用SQLite.
1> 开发工具: EVC4.0 + SP2
2> 编译出所需的 SQLite DLL.
a> 在 http://sqlite-wince.sourceforge.net/ 中下载 SQLite for Windows CE 的DLL 源代码.
b). 打开eVC新建一个“WCE Dynamic-Link Library”工程,命名为:sqlite3
c). 在接下来的对话框中选择"An empty Windows CE DLL project",点击 FINISH,之后再点击 OK
d). 将源码中所有的 *.c *.h *.def 复制到工程文件夹下
e). 在 Source Files 中添加除shell.c和tclsqlite.c这两个文件以外所有 *.c 的SQLite源文件文件
f). 在 Header Files 中添加所有 *.h 的SQLite源文件文件
g). 将 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
h). 在eVC中选好你要编译的平台,例如“Win32(WCE ARMV4I) Release”
i). 好了,开始编译,Build(F7)一下
3> 编译出DLL后,需要使用C++对DLL中的功能进行封装.有如下资源可参考:
a> http://www.codeproject.com/KB/database/CppSQLite.aspx
b> http://www.adp-gmbh.ch/sqlite/wrapper.html
如上 a,b 资源,尽管已对 SQLite Dll 中的功能进行封装,然而 WinCE,Mobile上使用的是UNICODE编码,而 a,b 却并未支持UNICODE.所以真正要用到的是 a 资源中的 unicode 版本,如下:
http://softvoile.com/development/CppSQLite3U/
4> 有了 SQLite DLL 及 CppSQLite3U 后,便可以很方便地使用 SQLITE :(步骤3中,a链接页画下就有DEMO)
主要代码如下:
#define
FILE_DB_NAME TEXT("unitech.db")
//
获取程序当前路径
void
GetCurrentDirectory(CString
&
szPath)
{
wchar_t pBuf[
256
];
GetModuleFileName(NULL,pBuf,
sizeof
(pBuf)
/
sizeof
(wchar_t));
szPath
=
pBuf;
szPath
=
szPath.Left(szPath.ReverseFind(
'
\\
'
)
+
1
);
}
void
CDemo2Dlg::OnButton1()
{
CString strDbPath;
GetCurrentDirectory(strDbPath);
strDbPath
+=
FILE_DB_NAME;
CppSQLite3DB db;
try
{
//
打开或新建一个数据库
db.open(strDbPath);
//
判断表名是否存在
if
(db.tableExists(L
"
tblTest
"
))
{
AfxMessageBox(L
"
Table: tblTest is existed!
"
);
}
else
//
不存在
{
AfxMessageBox(L
"
Table: tblTest not existed!
"
);
//
新建表
db.execDML(L
"
create table tblTest(empno varchar(20), empname varchar(20))
"
);
}
//
插入一笔记录
db.execDML(L
"
insert into tblTest values('编号', '姓名')
"
);
//
插入一笔记录
db.execDML(L
"
insert into tblTest values('精瑞电脑', 'Answer')
"
);
//
删除一笔记录
db.execDML(L
"
delete from tblTest where empno='编号'
"
);
//
插入10笔记录(使用事务)
TCHAR buf[
256
];
db.execDML(L
"
begin transaction;
"
);
for
(
int
i
=
0
; i
<
10
; i
++
)
{
memset(buf,
0
,
sizeof
(buf));
wsprintf(buf, L
"
insert into tblTest values ('no%d', 'name%d');
"
, i, i);
db.execDML(buf);
}
db.execDML(L
"
commit transaction;
"
);
//
更新一笔记录
db.execDML(L
"
update tblTest set empname='answer' where empno='no1'
"
);
//
获取总笔数
int
count
=
db.execScalar(L
"
select count(*) from tblTest;
"
);
TCHAR szCount[
50
];
memset(szCount,
0
,
sizeof
(szCount));
wsprintf(szCount, L
"
Count:%d
"
, count);
AfxMessageBox(szCount);
//
获取每一笔
CppSQLite3Query q
=
db.execQuery(L
"
select * from tblTest
"
);
while
(
!
q.eof())
{
AfxMessageBox(q.fieldValue(
0
));
q.nextRow();
}
q.finalize();
db.close();
AfxMessageBox(L
"
OK
"
);
}
catch
(CppSQLite3Exception ex)
{
AfxMessageBox(ex.errorMessage());
}
}
5> 成功完成,Enjoy it~~~
6> 下载:
a> SQLite3 For WinCE Source
b> CppSQLite3U For WinCE Source
c> Demo Source
d> Demo Exe
7> 推荐一个SQLite的可视化工具:
SQLiteSpy: http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index
下载