SQLite3

SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以"."开头(如:mysql中查看当前有哪些数据库是“show databases",而sqlite中是".databases")。当然,SQL语句都是一样的语法规则。

  1. Host System: Archlinux
  2. gcc: 4.6.1 20110819
  3. sqlite3: 3.7.8 20110919

系统一般没有默认安装sqlite数据库,所以先要安装sqlite3:

  1. # pacman -S sqlite3

可以使用"sqlite3 + 数据库名"来打开一个数据库。

常用函数

  1. sqlite3_open(const char *filename, sqlite3 **ppDb);
  2. sqlite3_close(sqlite3 *db);
  3. sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**),  void *, char **errmsg);

这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为"sqlite3.h"。

  • 打开(新建)数据库

     
    1. sqlite3 *db;
    2. sqlite3_open("test.db", &db);
  • 关闭数据库
     
    1. sqlite3_close(db);
  • 执行sql语句(以创建表为例)
     
    1. char sql[128];
    2. memset(sql, '\0', 128);
    3. sprintf(sql, "%s%s%s", "create table ", "test_tb", "(id INTEGER PRIMARY KEY, data TEXT)");
    4. sqlite3_exec(db, sql, NULL, NULL, NULL);

    sqlite3_exec中第一个和第二个参数的意义很好理解。第三个参数是一个回调(callback)函数。第四个参数可用于给回调函数传入一个参数。第五个参数为这条sql语句执行后的返回。我试了好几次,第五个参数的返回值打印出来都是乱码,所以建议直接查看sqlite3_exec函数的返回指,它返回一个整型的数,可以通过这个数字来得知的执行结果。

    下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <sqlite3.h>
    4. /* callback函数中:
    5. * arg: 是从主函数传进来的参数
    6. * values: 是查询结果的值
    7. * names: 查询结果列的名字
    8. */
    9. int wf_callback(void *arg, int nr, char **values, char **names)
    10. {
    11. int i;
    12. FILE *fd;
    13. char str[128];
    14. fd = (FILE *)arg; //将void *的参数强制转换为FILE *
    15. for (i=0; i<nr; i++) { //将查询结果写入到文件中
    16. memset(str, '\0', 128);
    17. sprintf(str, "\t%s\t", values[i]);
    18. fwrite(str, sizeof(char), sizeof(str), fd);
    19. }
    20. memset(str, '\0', 128);
    21. fwrite("\n", sizeof(char), 2, fd); //写完一条记录换行
    22. return 0;  //callback函数正常返回0
    23. }
    24. int main()
    25. {
    26. char sql[128];
    27. sqlite3 *db;
    28. FILE *fd;
    29. sqlite3_open("test.db", &db);  //打开(或新建)一个数据库
    30. memset(sql, '\0', 128);
    31. /* 新建一张表 */
    32. strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
    33. sqlite3_exec(db, sql, NULL, NULL, NULL);
    34. /* 新建一个文件,把数据库的查询结果保存在该文件中 */
    35. fd = fopen("test", "w");
    36. fwrite("Result: \n", sizeof(char), 10, fd);
    37. memset(sql, '\0', 128);
    38. strcpy(sql, "select * from tb");
    39. sqlite3_exec(db, sql, wf_callback, fd, NULL);
    40. fclose(fd);
    41. sqlite3_close(db); //关闭数据库
    42. return 0;
    43. }

    编译、运行结果如下图:

    我们关注这里的回调函数wf_callback()。sqlite3_exec()函数先执行sql语句,如果sql语句的执行结果不为空,则调用回调函数进行处理。test文件中有3行数据,所以wf_callback()函数被调用了三次(这里我们也可以在回调函数中添加一个全局变量来计数,以查看回调函数是否多次被调用)。因为回调函数会被多次调用,所以这里在main函数中打开文件,把文件描述符以参数的形式传递给回调函数;否则,将fopen和fclose写到回调函数中,每调用一次回调函数,回调函数都会以“w”去打开文件,第二次调用回调函数的结果会覆盖第一调用回调函数的结果,使写入文件的内容不正确(只会在文件中写入最后一条记录)。

    如果在查询语句中调用了SQL中的一些函数,如sum()等,也可以同样用回调函数来处理查询结果,如:

    1. strcpy(sql, "select sum(id) from tb");
    2. sqlite3_exec(db, sql, sum_callback, NULL, NULL);

    则回调函数可以为:

    1. int result;
    2. int sum_callback(void *arg, int nr, char **values, char **names)
    3. {
    4. result = atoi(values[0]);
    5. return 0;
    6. }

    然后再对result进行处理。当然,也可以不定义这个全局变量,而直接在回调函数里对result进行处理。需要注意的是,查询结果均为字符数组形式的,所以如果需要的结果是int型或者float型,则需要相应的函数来转换,如atoi(),atof()等。

    原文地址:http://www.linuxidc.com/Linux/2011-10/45920.htm

转载于:https://www.cnblogs.com/bluestorm/archive/2011/10/25/2298127.html

Linux C SQLite3 编程相关推荐

  1. Linux下sqlite3移植与编程

    目标平台:LOONGSON-1B开发板 内核:Linux 3.0 编译平台:ubuntu10.04 交叉工具链:gcc-3.4.6-2f 简介 sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在 ...

  2. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  3. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

  4. Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)

    很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返 ...

  5. 【linux草鞋应用编程系列】_4_ 应用程序多线程

    一.应用程序多线程 当一个计算机上具有多个CPU核心的时候,每个CPU核心都可以执行代码,此时如果使用单线程,那么这个线程只能在一个 CPU上运行,那么其他的CPU核心就处于空闲状态,浪费了系统资源: ...

  6. Linux下高性能网络编程中的几个TCP/IP选项

    Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...

  7. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 main函数的多种 ...

  8. linux下多进程编程简介

    两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...

  9. [zz]Linux 下 socket 编程示例

    本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据:Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据.代码虽短, ...

最新文章

  1. React Native进行签名打包成Apk
  2. 廖雪峰Java1-2Java程序基础-3整数运算
  3. 诺基亚塞班系列最强回顾(搬运整理)
  4. java类与对象 —(10)
  5. B/S开发中浏览器的工具利器
  6. android+4.4.2+横屏,Android 横竖屏和布局问题
  7. ERP流程入门_从会计分录理解企业基本流程[转]
  8. MegCup 2017 极客挑战赛 初赛试题
  9. lombok slfj 中_lombok @Slf4j注解
  10. IR2104驱动原理--恩智浦智能车电机驱动
  11. Jensen不等式简介及推导
  12. 华为od德科面试数据算法真题解析-专栏必看-
  13. STM32-ESP8266wifi模块实现
  14. origin8.1中文乱码设置方法
  15. Ubuntu下svn回滚到指定版本
  16. java微信模板消息开发,微信公众号模板消息开发小结
  17. django-上下文处理器
  18. 微信小程序之评分页面
  19. 将华氏度转换为摄氏度的简单代码
  20. python结合conda安装ifcopenshell报错Preparing transaction: failed的解决办法

热门文章

  1. 宝塔php open_basedir restriction in effect
  2. Web App适配iPhoneX
  3. FieldGroup绑定的日期类型存储格式的问题
  4. 让ASPX和ASMX脱离IIS运行的例子(ASP.NET宿主程序)
  5. Haha!Sniffer Pro终于可以用啦~
  6. Android面试题目之六---Handler,Looper和MessageQueue深入研究
  7. Android 多点触控 MotionEvent详解
  8. opengl 贴图坐标控制_材质贴图正确打开方式
  9. Android之了解ThreadLocal
  10. PHP学习笔记-字符串操作1