关于SQLite

简介:

最近在项目中用到了SQLite。主要是客户端用到,这种小型内嵌数据库还是蛮实用的。

提起SQLite我不自觉的就想起了微软出的ACCESS。他们两个确实是有可比性的。曾经,小型网站数据库,ASP可以用到ACCESS。但是,PHP却是没有相对应的解决方案,自从SQLite的出现,给PHP提供了一个解决方案。

在客户端里面,我用到的数据保存方案有:CSV、INI、XML。其中XML是最强大的,但是可惜的是我用的解析器是Tinyxml,实用tinyxml的初衷就是简单,只用于配置,所以再复杂的事情就有些应付不过来。至少,逻辑上要复杂上许多。

我最近,看了迅雷,搜狗……一些软件的目录,都有一个sqlite3.dll。于是就去了解了下。貌似现在很多的im软件用这个做客户端数据库的也多起来了。看起来这个项目还是不错的。

SQLite有好几种版本,如果要想内嵌到应用程序当中去,那就要用sqlite-amalgamation这个版本了。它就是一个头文件,一个c的实现文件,这个文件里面有十多万行代码。我用VS2003编译的时候,编译器会提醒我,行数有些超长了-_-!!

C++里面对SQLite的包装类库里面,我觉得SOCI算是很不错的,这个项目不仅仅是对SQLite进行了包装,而且对其他数据库都有包装,像MySQL、PostgreSQL、Oracle这些数据库都支持,还支持ODBC。如果感兴趣可以看我转载的一篇博文:http://www.cppblog.com/tx7do/archive/2009/11/27/102054.html

“工欲善其事,必先利其器。”
既然是数据库,那我自然要有工具能够编辑数据库了。我找了找SQLite的数据库工具,一搜一大把。我试用了好多种,都不是很好用。最终才确定了SQLite Expert Professional,这款商业软件。当然,我很无耻的用了破解版。破解版在www.gougou.com里面就能搜索到。我是倾向于用开源软件的,但是很无奈的是,虽然相关的工具很多很多,但是就没有一款真正好用的。

我在用SQLite Expert创建数据库的时候,发现有一个选择编码的选项,但是很可惜的是全部都是UTF系的编码……我习惯性的选择了UTF8,这个也是它的默认选项。我创建了一个测试的数据库,随便弄了个表,打了几个字,然后保存。再用VS2003做了一个测试程序,结果读进来的是乱码。后来我把数据库文件放到一个路径里面有中文的路径下,结果它找不到文件,看来它完完全全的使用了UTF字符,包括对路径的处理。看起来,只能转码了。以下附上两个Windows下的转码的方法:

None.gifstd:: string UTF8ToAnsi(  const std:: string& strIn, std:: string& strOut )
ExpandedBlockStart.gif {
InBlock.gif    WCHAR* strSrc    = NULL;
InBlock.gif    TCHAR* szRes    = NULL;
InBlock.gif
InBlock.gif    int i = MultiByteToWideChar(CP_UTF8, 0, strIn.c_str(), -1, NULL, 0);
InBlock.gif
InBlock.gif    strSrc = new WCHAR[i+1];
InBlock.gif    MultiByteToWideChar(CP_UTF8, 0, strIn.c_str(), -1, strSrc, i);
InBlock.gif
InBlock.gif    i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
InBlock.gif
InBlock.gif    szRes = new TCHAR[i+1];
InBlock.gif    WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
InBlock.gif
InBlock.gif    strOut = szRes;
InBlock.gif
InBlock.gif    delete[] strSrc;
InBlock.gif    delete[] szRes;
InBlock.gif
InBlock.gif    return strOut;
ExpandedBlockEnd.gif}

None.gif


 

None.gifstd:: string AnsiToUTF8(  const std:: string& strIn, std:: string& strOut )
ExpandedBlockStart.gif {
InBlock.gif    WCHAR* strSrc    = NULL;
InBlock.gif    TCHAR* szRes    = NULL;
InBlock.gif
InBlock.gif    int len = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strIn.c_str(), -1, NULL,0);
InBlock.gif
InBlock.gif    unsigned short* wszUtf8 = new unsigned short[len+1];
InBlock.gif    memset(wszUtf8, 0, len * 2 + 2);
InBlock.gif    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strIn.c_str(), -1, (LPWSTR)wszUtf8, len);
InBlock.gif
InBlock.gif    len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
InBlock.gif
InBlock.gif    char* szUtf8 = new char[len + 1];
InBlock.gif    memset(szUtf8, 0, len + 1);
InBlock.gif    WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
InBlock.gif
InBlock.gif    strOut = szUtf8;
InBlock.gif
InBlock.gif    delete[] szUtf8;
InBlock.gif    delete[] wszUtf8;
InBlock.gif
InBlock.gif    return strOut;
ExpandedBlockEnd.gif}

None.gif



这两个方法可能不能直接编译过,有一些自己的东西,需要稍事修改。
用AnisToUTF8将输入的字符串全都转换为UTF8。用UTF8ToAnis将所有输出的字符串全部都转化为多字节字符。


引用:
SQLite:http://www.sqlite.org/
SOCI:http://soci.sourceforge.net/
SQLite Expert Professional:http://www.sqliteexpert.com/

目录
相关文章
|
2月前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
171 0
|
4月前
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
43 0
|
3月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
184 2
|
7天前
|
SQL 存储 Ubuntu
在ubuntu中将dict.txt导入到数据库sqlite3
这样,你就成功将 `dict.txt` 中的数据导入到名为 `mydatabase.db` 的SQLite3数据库中的 `words` 表格中了。请根据实际情况调整表格结构和数据导入命令。
14 0
|
18天前
|
SQL 数据库 数据库管理
Python数据库操作(SQLAlchemy、SQLite等)面试题集
【4月更文挑战第15天】本文介绍了Python数据库操作的面试重点,涵盖SQLAlchemy ORM和SQLite。内容包括:1) 使用SQLAlchemy定义SQLite表的Python类及执行CRUD操作,强调ORM使用和会话管理;2) 查询优化与性能,涉及JOIN、分组、聚合查询,并提醒注意懒加载和索引创建;3) 异常处理和事务管理,展示如何捕获异常并进行事务控制。通过理解这些知识点并避免常见错误,可在面试中表现出色。
21 0
|
23天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
28天前
|
关系型数据库 MySQL 数据库连接
Python+SQLite数据库实现服务端高并发写入
Python中使用SQLite内存模式实现高并发写入:创建内存数据库连接,建立表格,通过多线程并发写入数据。虽然能避免数据竞争,但由于SQLite内存模式采用锁机制,可能在高并发时引发性能瓶颈。若需更高性能,可选择MySQL或PostgreSQL。
33 0
|
2月前
|
数据库连接 API 数据库
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
52 0
|
2月前
|
关系型数据库 数据库 C++
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
|
2月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
83 0