Windows Mobile下访问Sqlite的Native C++封装 qlite几乎成立移动设备开发领域数据存储方面的事实标准。Sqlite已经广泛被使用到AndriodiPhoneWebOS以及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。创建数据库文件TEST(SqliteHelper, CreateDatabase) { try { CppSQLite3DB db; DeleteFile(DB_FILE_NAME); db.open(DB_FILE_NAME); db.close(); } catch(CppSQLite3Exception e) { FAIL(ToString(e.errorMessage()).c_str()); } TRACE(Create database successful.); }调用CppSQLite3DB 的open()函数的时候如果发现没有数据库文件就会新建一个数据库文件。Sqlite的源代码如下(见sqlite3.c)rc openDatabase(zFilename8, ppDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);执行DDLTEST(SqliteHelper, CreateTable) { try { CppSQLite3DB db; db.open(DB_FILE_NAME); db.execDML(Lcreate table T1(F1 int, F2 char(20), F3 char(20));); db.close(); } catch(CppSQLite3Exception e) { FAIL(ToString(e.errorMessage()).c_str()); } TRACE(Create table successful.); }执行CppSQLite3DB 的execDML()函数可以执行DDL。Sqlite3的数据类型定义和其他常见关系型数据库有很大区别Sqlite3数据类型定义信息是和具体的数据绑定的而不是和字段定义绑定也就是动态的同一个字段的不同记录可以存储不同的数据类型的数据。所以在定义表的时候定义字段类型不是必须的具体可以参考 Datatypes In SQLite Version 3。执行DMLTEST(SqliteHelper, InsertTable) { try { CppSQLite3DB db; db.open(DB_FILE_NAME); CString sqlStr; time_t tmStart, tmEnd; tmStart time(0); for(int i0; imax; i) { SYSTEMTIME currentTime; GetLocalTime(currentTime); sqlStr.Format(LINSERT INTO T1 (F1, F2, F3) VALUES(%d, STR%d, %d-%d-%d %d:%d:%d), i, i, currentTime.wYear, currentTime.wMonth, currentTime.wDay, currentTime.wHour, currentTime.wMinute, currentTime.wSecond); db.execDML(sqlStr); } tmEnd time(0); char ch[255]; sprintf(ch, Insert table successful in %d seconds, tmEnd-tmStart); TRACE(ch); db.close(); } catch(CppSQLite3Exception e) { FAIL(ToString(e.errorMessage()).c_str()); } }CppSQLite3DB 的execDML()函数不仅可以执行DDL而且可以执行DML。同理Update和Delete语句一样。执行ScalarTEST(SqliteHelper, SelectScalarBeforeInsert) { try { CppSQLite3DB db; db.open(DB_FILE_NAME); int count db.execScalar(LSELECT COUNT(*) FROM T1;); char ch[255]; sprintf(ch, %d rows in T1 table, count); TRACE(ch); db.close(); } catch(CppSQLite3Exception e) { FAIL(ToString(e.errorMessage()).c_str()); } TRACE(Select scalar before insert successful.); }CppSQLite3DB 的execScalar()函数模仿ADO.NET的SqlCommand.ExecuteScalar 用于取第一条记录的一个字段的值一般用于聚集函数的查询。执行查询TEST(SqliteHelper, SelectAfterInsert) { try { CppSQLite3DB db; db.open(DB_FILE_NAME); CppSQLite3Query q db.execQuery(LSELECT * FROM T1;); std::string str; char ch[255]; while (!q.eof()) { sprintf(ch, F1%d, F2%S, F3%S\n, q.getIntField(0), q.getStringField(1), q.getStringField(2)); str ch; q.nextRow(); } TRACE(str.c_str()); db.close(); } catch(CppSQLite3Exception e) { FAIL(ToString(e.errorMessage()).c_str()); } }查询需要借助CppSQLite3Query 来取出查询的结果。eof()函数判断是否结束。nextRow()移动到下一条记录。getIntField()函数和getStringField()函数为读取当前记录的特定字段的值。使用事务TEST(SqliteHelper, InsertTableWithTransaction) { try { CppSQLite3DB db; db.open(DB_FILE_NAME); CString sqlStr; time_t tmStart, tmEnd; tmStart time(0); db.execDML(Lbegin transaction;); for(int i0; imax; i) { SYSTEMTIME currentTime; GetLocalTime(currentTime); sqlStr.Format(LINSERT INTO T1 (F1, F2, F3) VALUES(%d, STR%d, %d-%d-%d %d:%d:%d), i, i, currentTime.wYear, currentTime.wMonth, currentTime.wDay, currentTime.wHour, currentTime.wMinute, currentTime.wSecond); db.execDML(sqlStr); } db.execDML(Lcommit transaction;); tmEnd time(0); char ch[255];

相关新闻

最新新闻

EMC电缆屏蔽层360°搭接实战:1cm猪尾巴导致30%辐射超标风险

EMC电缆屏蔽层360°搭接实战:1cm猪尾巴导致30%辐射超标风险

EMC电缆屏蔽层360搭接实战:1cm猪尾巴导致30%辐射超标风险引言在硬件开发与EMC测试领域,电缆屏蔽层的处理工艺往往被工程师视为"细枝末节",但正是这些看似微小的细节,可能成为产品认证路上的"隐形杀手"。想象一…

2026/7/6 7:49:49
ASM330LHH IMU与PIC18F86J55在运动跟踪系统中的应用

ASM330LHH IMU与PIC18F86J55在运动跟踪系统中的应用

1. 运动跟踪技术的革新背景在当今的嵌入式系统和物联网设备中,精确的运动跟踪能力已经成为许多应用的核心需求。从消费电子产品的姿态识别到工业设备的振动监测,再到医疗设备的运动分析,6自由度(6DoF)惯性测量单元(IMU)正在改变我们与物理世界…

2026/7/6 7:49:49
碧蓝航线Alas自动化脚本:如何实现24小时不间断的游戏管家体验

碧蓝航线Alas自动化脚本:如何实现24小时不间断的游戏管家体验

碧蓝航线Alas自动化脚本:如何实现24小时不间断的游戏管家体验 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还…

2026/7/6 7:49:49
iPhone备份文件夹MobileSync为什么占用C盘很大,怎么迁移和清理

iPhone备份文件夹MobileSync为什么占用C盘很大,怎么迁移和清理

很多人在C盘属性里看到几十个G不知道去向,打开文件夹逐层翻,最后翻到一个叫 Apple Computer 或者 Apple\MobileSync 的目录,里面塞满一串看不懂的字母数字文件夹。这其实是iPhone、iPad在这台电脑上做的本地全量备份,不是普通程序…

2026/7/6 7:49:49
WSEN-ISDS 6DOF IMU与PIC18微控制器的运动跟踪方案

WSEN-ISDS 6DOF IMU与PIC18微控制器的运动跟踪方案

1. 项目背景与硬件选型解析在机器人导航、工业自动化控制、无人机飞控等需要精确空间感知的领域,三轴运动跟踪一直是核心技术难点。传统方案往往需要分别使用加速度计和陀螺仪,再通过复杂的数据融合算法才能获得完整的三维运动数据。而WSEN-ISDS (253603…

2026/7/6 7:49:49
拯救者笔记本终极优化指南:3步释放C盘空间,提升系统性能

拯救者笔记本终极优化指南:3步释放C盘空间,提升系统性能

拯救者笔记本终极优化指南:3步释放C盘空间,提升系统性能 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …

2026/7/6 7:44:48

月新闻