C/C++中Sqlite使用简介

一、简介

SQLite是一个基于文件的轻量级数据库,但功能还挺强,速度也很快,对于小型数据库应用开发绝对够用了。使用起来也非常方便,下面的介绍可以看出来,使用起来真的非常简单。

 

二、官方网站

 

Sqlite的官方网站www.sqlite.org,在该网站可以下载最新的sqlite版本。

 

 

三、辅助工具工具

     Sqlite数据库的管理工具有SQLiteManager、SqliteAdmin等。

SqliteManager只有英文版,但功能强大,有个问题就是不支持ANSI字符集的汉字显示。其自带的帮助文档有SQL语句的详细介绍,对于不熟悉Sql语句的人来说很方便。而且它的很多操作都有自动的SQL语句提示,对于不常使用数据库的人来说也很好用。

SqliteAdmin有绿色中文版,功能相对于SqliteManager略少,对于熟悉Sql语句的人,该版本够用了。

 

四、C/C++使用前准备

直接将sqlite3.h和sqlite3.c加入自己的C/C++工程中,即可使用sqlite3。

 

五、打开关闭数据库

Sqlite支持UTF-8和UTF-16,不过它居然不支持C/C++程序中最常用的ANSI。因此数据库路径中如果包含中文字符的话,需要将路径转换成相应的字符格式。

1、以UTF-8方式打开


//打开数据库

sqlite3 *db = NULL;

int result = sqlite3_open("c:\\abc.db", &db);

if (SQLITE_OK != result)

{

    return;

}

 

//关闭数据库

sqlite3_close(db);

 

2、以UTF-16方式打开

如要以UTF-16方式打开,把打开数据库的语句改为"sqlite3_open16(L"c:\\abc.db", &db)"即可。

但一般情况,强烈不建议使用UTF-16方式打开数据库,根据我的测试,我发现如果以这种方式打开数据库,在后续创建数据表的时候,如果其中有某项为TEXT类型。那么数据表的这项数据内容,将会强制确定类型为UTF-16。也就是说,你插入的任何数据,都将被转换为UTF-16并存入数据库。而执行SQL的语句是UTF-8格式的,因此当你取出的数据和你存入的数据是不一致的,很显然这对于使用者而言是一个灾难。

 

六、执行SQL语句

执行SQL语句可以调用sqlite3_exec函数,一般来说,如果不需要返回的数据和错误信息,执行方式如下:

 


sqlite3_exec(db, strSQL, 0, 0, 0);

1、创建表

假设创建如下图所示的数据库:

其SQL语句为:


CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL, [MyDate] DATE NOT NULL, [MyTime] TIME NULL,[MyFloat] FLOAT NULL)

 

2、插入记录

下面是插入一条记录的示例SQL语句。


INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000)

 

3、更新记录

下面是更新若干条记录的示例SQL语句。


UPDATE MyTable SET MyText='真的吗?', MyTime='10:00:00' WHERE ID >=0 AND ID <=20

 

4、删除记录

下面是删除若干条记录的示例SQL语句。


DELETE FROM MyTable WHERE ID >=3 AND ID <=5

 

5、批量操作

如果要进行大量的操作,比如要插入10000条数据,如果逐条执行SQL语句,则消耗的时间非常长。采用事务的方式批量处理,可以极大程度提升操作速度(我用1000条记录实验了一下,速度提高了500倍以上)。

下面是一个批量插入10000条数据的代码示例:


//插入条数据(在Begin和Commit之间批量操作,可以大幅度提高效率)

result = sqlite3_exec(db, "BEGIN;", 0, 0, 0);

for (int i=0; i<10000; i++)

{

    //插入一条数据

    result = sqlite3_exec(db,

        "INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000);",

        0, 0, 0);

}

result = sqlite3_exec(db, "COMMIT;", 0, 0, 0);

 

 

七、查询并返回结果 

 

1、以表单形式返回

下面是以表单形式获取数据的示例代码:


//查询记录(返回数据表的方式)

char **pazResult;

int nRow, nCol;

sqlite3_get_table(db, "SELECT * FROM MyTable LIMIT 1000 OFFSET 2000", &pazResult, &nRow, &nCol, 0);

 

//nRow指示出有多少行

//nCol指示出有多少列

//从pazResult中可以解析出所有记录,记录以字符串形式返回

//第n列的名称,存放于pazResult[n]

//第n行第m列的数据,存放与paszResult[(m + 1) * nCol + m]

 

//使用完后,务必释放为记录分配的内存

sqlite3_free_table(pazResult);

上面的查询代码,也演示了如何查询指定位置指定条数的记录,这种查询方法在记录集非常庞大的时候很有用。

 

2、以回调形式返回

下面以代码形式示例如何获得查询语句返回的记录。

首先需要定义一个回调函数如下(参数意义待会再说):


int Result(void* pContext, int nCol, char** azValue, char** azName);

然后调用sqlite函数执行查询语句,在回调函数一栏输入上面定义的回调函数:


sqlite3_exec(db, "SELECT * FROM MyTable LIMIT 10 OFFSET 20", Result, 0, 0);

执行该SQL语句时,每返回一条记录都会触发一次上面的回调函数,在该回调函数的实现中,即可得到查询结果。

在上面的Result函数中,各个参数意义如下:


pContext


这个参数是调用sqlite3_exec函数是输入的第4个参数。它通常作为环境变量用于指示出当前执行代码的主体。示例代码中我忽略了这个参数,但正式使用时一般不会忽略它。


nCol


表示该条记录有多少列。


azValue


返回的数据都蕴含在该变量中,它也是一个字符串数组。azValue[n]即为第n列的数据。


azName


存放列的名称,azName[n]就是第n列的名称。

 

 

八、存取二进制数据

存取二进制数据需要用到sqlite3_bind_blob等函数,具体用法可以查看这些函数的声明。作为一个轻量级数据库,我一般不用它存储二进制数据,因此这儿不再详细描述这些内容。

时间: 2024-10-30 20:14:22

C/C++中Sqlite使用简介的相关文章

Android中的SQLite数据库简介

SQLite简介: SQLite是Android系统采用的一种开源的轻量级的关系型的数据库,Android中允许每个应用程序都拥有自己独立的数据库,每个应用程序的数据库的位置一般在/data/data/<package_name>/databases中.为了方便开发人员的使用,Android的API对增删查改实现了封装,通过SQLiteOpenHelper类可以方便的实现对数据库的创建和管理操作.不过正式的使用数据库之前,我们还要知道两个基本知识点. Content Values 和Curso

iOS中SQLite数据库使用详解

使用SQLite数据库 创建数据库 创建数据库过程需要3个步骤: 1.使用sqlite3_open函数打开数据库: 2.使用sqlite3_exec函数执行Create Table语句,创建数据库表: 3.使用sqlite3_close函数释放资源. 这个过程中使用了3个SQLite3函数,它们都是纯C语言函数,通过Objective-C去调用C函数当然不是什么问题,但是也要注意Objective-C数据类型与C数据类型兼容性问题. 下面我们使用SQLite技术实现备忘录案例,与属性列表文件实现

android中sqlite一直报错

问题描述 android中sqlite一直报错 在应用中用到sqlite,创建了一些表,代码如下: db.execSQL("CREATE TABLE IF NOT EXISTS " + GAMES_HISTORY_TABLE+ " (" + GAME_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " + RIGHT_DRILLS + "INTEGER NOT NULL, " + NUM_

iOS中sqlite数据库的原生用法_IOS

在iOS中,也同样支持sqlite.目前有很多第三方库,封装了sqlite操作,比如swift语言写的SQLite.swift.苹果官网也为我们封装了一个框架:CoreData. 它们都离不开Sqlite数据库的支持. 本文主要介绍下,如何在swift中使用原生的sqlite的API. 在Xcode中引入sqlite API 新建一个swift项目后,我们需要让项目引入sqlite的动态链接库: 1.项目配置界面,选择Build Phases 2.点开Link Binary With Libra

iOS中sqlite的详细用法_IOS

本文实例为大家分享了ios中sqlite的具体操作方法,供大家参考,具体内容如下 #import <sqlite3.h> @interface ViewController () { sqlite3 *_sqldb; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typicall

sqlite-ios中SQLite和core data使用求解

问题描述 ios中SQLite和core data使用求解 本人ios开发小白一枚,有几点疑问想咨询一下ios开发前辈. 第一:在ios app开发中,什么类型的应用会用到SQLite或者core data:第二:已经在运营中的电商类型的网站,数据库使用的是mysql,现在需要开发ios的app,app端的数据应该怎么和服务器进行通信呢?登陆,下单,支付等操作时的通信怎么才能保证数据传输的安全性呢? 解决方案 (1)需要本地数据存储的,需要离线运行的(2)使用web service,加密传输的信

android开发中sqlite的使用

问题描述 android开发中sqlite的使用 请问在开发中sqlite的使用广泛吗?求举个例子使用sqlite完成什么功能,学了知识点不知什么情况会用到,各位前辈们求指点啊! 解决方案 使用数据库实现对数据的存储. 下面上一个小例子,写日记. 效果如下: ? ? ?? ?? 当LIstView中没有数据显示时,我们需要告诉用户没有数据. 方法有二: 1. activity继承ListActivity,在布局文件中如下编写: android:id="@id/android:empty"

android 中 sqlite 一般用来干什么?

问题描述 android 中 sqlite 一般用来干什么? 做过几个APP,但是很少用到sqlite ,所以想请教各位大神,我们一般在什么时候会用到sqlite呢,用来保存些什么信息,.. 解决方案 比如应用中存储一些基本的枚举信息,一些应用的参数设置等 解决方案二: 存储数据啊,就是本地数据库,支持sql语句 解决方案三: SQLite是一种数据库存储方式.没有特定的使用环境,你想用就用呗.可以考虑使用SQLite是key-value的存储方式.在一些安全性要求不高的App中,你可以用它来做

sqlite-android中SQLite数据库的触发

问题描述 android中SQLite数据库的触发 要求设置一个触发,在数据库中的Task表中加入了一个新task时,同时往Record表中插入一条新记录.我需要在标准匹配task的item表中,对每个开放项目插入一个record.虚拟码如下: CREATE TRIGGER update_item_records ON INSERT INTO tasksBEGIN SELECT item in ITEMS WHERE item.type=new.type AND item.program=new