介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的:
1,先安装两个东西:
sudo apt-get install sqlite sqlite3
sudo apt-get install libsqlite3-dev // 不然可能会报 没有头文件 sqlite3.h
2,C/C++接口:一般用到下面这三个,详情请参考sqlite官方文档。
(1)sqlite3_open(const char *filename, sqlite3 **ppDb):
打开一个数据库连接, 返回sqlite3对象。
(2)sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg):
解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
(3)sqlite3_close(sqlite3*):
关闭之前打开的数据库。
3、打开数据库并创建表
#include<stdio.h>
#include<sqlite3.h> // 暂时先不管
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db); // 打开数据库
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg); // 执行上面sql中的命令
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "create table successfully\n");
} sqlite3_close(db);
return ;
}
运行:需要链接sqlite3库,下面的其他操作也是如此。
gcc sqlite3test.c -o create -l sqlite3
4、插入数据:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} // sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))"; sql = "insert into company(ID, NAME, AGE, ADDRESS) values(1, 'Paul', 25, 'USA');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'James', , 'JAP');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'Yao', , 'CHA');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'kobe', , 'USA');"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "insert table successfully\n");
} sqlite3_close(db);
return ;
}
5、查询数据:
注意:这里的callback函数,是sqlite的一个回调函数,格式如下(必须按照这个格式):
int sqlite_callback(
void* NotUsed, /* 由 sqlite3_exec() 的第四个参数传递而来 */
int argc, /* 表的列数 */
char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
char** azColName /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
);
执行sqlite3_exec() 时作为参数传进去。
说明:
参数:
NotUsed:由sqlite3_exec传递的初始化参数
argc:表头的列数
azColName:表头的名字数组指针,在我们的例子就是指向{ID, NAME, AGE, ADDRESS}的指针
argv:表头的数据数组指针
返回值:
1:中断查找
0:继续列举查询到的数据
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "select table successfully\n");
} sqlite3_close(db);
return ;
}
请看输出:
6、更新并查询:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "update company set ADDRESS = 'RUS' where ID = 3;\
select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "update table successfully\n");
} sqlite3_close(db);
return ;
}
7、删除并查询:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "delete from company where ID = 2;\
select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "delete table successfully\n");
} sqlite3_close(db);
return ;
}
8,上面的例子可在下面找到:
https://github.com/xcywt/MySQLite
学习SQLite之路(五) C/C++ SQLite开发实例的更多相关文章
-
我的VSTO之路(五):Outlook初步开发之联系人扩展
原文:我的VSTO之路(五):Outlook初步开发之联系人扩展 上一讲我们完成对Word的介绍,文本开始,我将着重介绍Outlook.Outlook是微软Office中一个非常实用的工具,尤其在一个 ...
-
python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
-
javaweb学习总结(二十五)——jsp简单标签开发(一)
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
-
SpringCloud学习成长之路 五 路由器网关
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...
-
UNP学习笔记(第五章 TCP客户/服务程序实例)
我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...
-
学习SQLite之路(三)
20160616更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite PRAGMA:可以用在 SQLite 环境内控制 ...
-
android安卓 SQLite教程:内部架构及SQLite使用办法
SQLite 介绍 SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.由于JDBC不适合手机这种内存受限设备,所以Android开发人员需要学习新的API ...
-
[Sqlite]--&;gt;Java采用jdbc联系Sqlite各种特定的工艺数据库的数据操作
引: 1, Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2.嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 3,嵌 ...
-
SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
SQLite 数据类型 SQLite 数据类型是一个用来指定任何对象的数据类型的属性.SQLite 中的每一列,每个变量和表达式都有相关的数据类型. 您可以在创建表的同时使用这些数据类型.SQLite ...
-
学习WCF之路,长期更新
我学习WCF之路:创建一个简单的WCF程序 为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本 ...
随机推荐
-
iOS---关于UIWebView
1.加载的web界面可以*收缩 webView.scalesPageToFit = YES;
-
[LeetCode] Word Squares 单词平方
Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...
-
Json.net对于导航属性的处理(解决对象循环引用)
对于两张表A.B多对多的关系中,A的导航属性中有B,B的导航属性中有A,这样Json.net对A或者B对象序列化时会形成死循环 所以对于导航属性要加标签 首先在A.B实体类工程(Model)中引用Js ...
-
Solr4.7新建core
Solr里面的core就像数据库里面的一个表,用来管理索引和相关配置. 一. 使用示例core 下载的solr完整包里面solr-4.7.0\example\multicore这个文件夹下面有2个示例 ...
-
挂载mount、卸载umount、挂载光盘U盘
mount [root@localhost ~]# mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) ...
-
SpringBoot入门之简单配置
今天下载了<JavaEE开发的颠覆者SpringBoot实战>这本书,发现Spring还有好多遗漏的部分,算是又恶补了一下,今天主要是学习下SpringBoot的配置. 一.基本配置 1. ...
-
python爬虫起步...开发环境搭建,最简单的方式
研究一门编程语言,一般第一步就是配置安装部署相关的编程环境.我认为啊,在学习的初期,大家不是十分了解相关的环境,或者是jar包,python模块等的相关内容,就不需要花费大量的时间去研究如何去安装它. ...
-
python 的基础 学习 第三天 编码的初始
1 编码的初始 计算机在存储数据和传输数据的时候,都是0101的二进制. ASCII(American Standard Code for Information Interchange,美国标准信 ...
-
异步请求Ajax(取得json数据)
异步请求Ajax 没有学习Ajax之前请求数据的时候都是整个页面全部刷新了一次,也就是每次请求都会重新请求所有的资源.但是在很多时候不需要页面全部刷新,仅仅是需要页面的局部数据刷新即可,此时需要发送异 ...
-
CentOS之Shell基础
Linux默认的shell版本是bash. 我们所敲的命令都是有记录的:被保存在.bash_history文件中.只有当用户正常突出shell时,命令才会保存至.bash_history中. !!:连 ...