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

发布时间:2026/10/23 3:17:44
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];

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询