找回密码
 立即注册
首页 业界区 业界 Windows Mobile下访问Sqlite的Native C++封装

Windows Mobile下访问Sqlite的Native C++封装

纪音悦 2025-5-29 14:57:24
背景

  当前移动设备开发领域,在本地数据存储方面,Sqlite几乎成了事实标准,Andriod (android.database.sqlite),iPhone (SQLite for iPhone SDK 和 FMDB for iPhone),Palm WebOS (webOS SQL Tutorial),新版本的Symbian也直接built-in Sqlite了(20 million Symbian smartphones shipped in Q3 2007 Newer versions of the SymbianOS have SQLite built in.)。那么作为移动设备领域的重要一员Windows Mobile怎么可能错过Sqlite呢。
   
  简介

  Sqlite几乎成立移动设备开发领域数据存储方面的事实标准。Sqlite已经广泛被使用到Andriod,iPhone,WebOS以及Symbian等平台了,本文讲述在Windows Mobile平台下如何使用Native C++访问Sqlite,同时讲述一个封装类的实现和使用。
   
  Sqlite源码

  Sqlite源码可以到 SQLite Download Page 下载,我为了省事直接使用了sqlite.phxsoftware.com的在Windows Mobile下的build工程。
   
  Sqlite的C++封装

  封装我使用了Tyushkov Nikolay的封装CppSQLite3U。这里感谢egmkang的推荐。CppSQLite3U封装是对Sqlite原有纯C的api进行OO的C++的封装。主要封装以下几个类:
  1. CppSQLite3DB 数据库类,用于新建数据库,打开关闭链接,执行DDL和DML。
  2. CppSQLite3Statement 用于执行参数化的SQL。CppSQLite3DB 可以执行SQL但是不支持参数化。
  3. CppSQLite3Query 用于读出执行Select后的查询结果。
  4. CppSQLite3Exception 用于捕捉异常。
  简单明了的封装了Sqlite。
   
  封装类的使用

  使用方法源自于我对CppSQLite3U类的单元测试。见源文件的SqliteHelperTest.h。
   
  创建数据库文件

  1. TEST(SqliteHelper, CreateDatabase)<br>{<br>    try<br>    {<br>        CppSQLite3DB db;<br>        DeleteFile(DB_FILE_NAME);<br>        db.open(DB_FILE_NAME);<br>        db.close();<br>    }<br>    catch(CppSQLite3Exception e)<br>    {<br>        FAIL(ToString(e.errorMessage()).c_str());<br>    }<br>    TRACE("Create database successful.");<br>}
复制代码
调用CppSQLite3DB 的open()函数的时候如果发现没有数据库文件就会新建一个数据库文件。Sqlite的源代码如下(见sqlite3.c):
  1. rc = openDatabase(zFilename8, ppDb,<br>                  SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
复制代码
 
执行DDL
  1. TEST(SqliteHelper, CreateTable)<br>{<br>    try<br>    {<br>        CppSQLite3DB db;<br>        db.open(DB_FILE_NAME);<br>        db.execDML(L"create table T1(F1 int, F2 char(20), F3 char(20));");<br>        <br>        db.close();<br>    }<br>    catch(CppSQLite3Exception e)<br>    {<br>        FAIL(ToString(e.errorMessage()).c_str());<br>    }<br>    TRACE("Create table successful.");<br>}
复制代码
执行CppSQLite3DB 的execDML()函数可以执行DDL。Sqlite3的数据类型定义和其他常见关系型数据库有很大区别,Sqlite3数据类型定义信息是和具体的数据绑定的而不是和字段定义绑定,也就是动态的,同一个字段的不同记录可以存储不同的数据类型的数据。所以在定义表的时候定义字段类型不是必须的,具体可以参考 Datatypes In SQLite Version 3。
 
执行DML

[code]TEST(SqliteHelper, InsertTable)
{
    try
    {
        CppSQLite3DB db;
        db.open(DB_FILE_NAME);
        
        CString sqlStr;
        time_t tmStart, tmEnd;
        tmStart = time(0);
        for(int i=0; i
您需要登录后才可以回帖 登录 | 立即注册